+NAME("irc").
+VSN("ubf1.0").
+TYPES
info() = info;
description() = description;
contract() = contract;
bool() = true | false;
nick() = string();
oldnick() = string();
newnick() = string();
group() = string();
logon() = logon;
proceed() = {ok, nick()} "A random nick is assigned";
listGroups() = groups;
groups() = [group()];
joinGroup() = {join, group()}
"You must join a group before you can send a message to it";
leaveGroup() = {leave, group()};
ok() = ok;
changeNick() = {nick, nick()} "Change your nick in all groups";
msg() = {msg, group(), string()} "send a message to a group";
msgEvent() = {msg, nick(), group(), string()};
joinEvent() = {joins, nick(), group()};
leaveEvent() = {leaves, nick(), group()};
changeNameEvent() = {changesName, oldnick(),newnick(), group()}.
%% I am assigned an initial (random) nick
+STATE start logon() => proceed() & active.
+STATE active
listGroups() => groups() & active;
joinGroup() => ok() & active;
leaveGroup() => ok() & active;
changeNick() => bool() & active;
msg() => bool() & active; % false if you have not joined the group
EVENT => msgEvent(); % A group sends me a message
EVENT => joinEvent(); % Nick joins group
EVENT => leaveEvent(); % Nick leaves group
EVENT => changeNameEvent(). % Nick changes name
+ANYSTATE
info() => string();
description() => string();
contract() => term().
|