diff options
Diffstat (limited to 'appl/spree/engines/chat.b')
| -rw-r--r-- | appl/spree/engines/chat.b | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/appl/spree/engines/chat.b b/appl/spree/engines/chat.b new file mode 100644 index 00000000..c409b272 --- /dev/null +++ b/appl/spree/engines/chat.b @@ -0,0 +1,60 @@ +implement Engine; + +include "sys.m"; + sys: Sys; +include "draw.m"; +include "../spree.m"; + spree: Spree; + Attributes, Range, Object, Clique, Member: import spree; + +clique: ref Clique; + +clienttype(): string +{ + return "chat"; +} + +init(g: ref Clique, srvmod: Spree): string +{ + sys = load Sys Sys->PATH; + clique = g; + spree = srvmod; + return nil; +} + +join(nil: ref Member): string +{ + return nil; +} + +leave(nil: ref Member) +{ +} + +Eusage: con "bad command usage"; + +command(member: ref Member, cmd: string): string +{ + e := ref Sys->Exception; + if (sys->rescue("parse:*", e) == Sys->EXCEPTION) { + sys->rescued(Sys->ONCE, nil); + return e.name[6:]; + } + (n, toks) := sys->tokenize(cmd, " \n"); + assert(n > 0, "unknown command"); + case hd toks { + "say" => + # say something + assert(n == 2, Eusage); + clique.action("say " + string member.id + " " + hd tl toks, nil, nil, ~0); + * => + assert(0, "bad command"); + } + return nil; +} + +assert(b: int, err: string) +{ + if (b == 0) + sys->raise("parse:" + err); +} |
