# # This file handles the Unicron protocol. It is used by both client # and server. # global handle_char # a client procedure; leave null for server class Commands(commands) #extract user command from user input method GetCommand(datagram) local l if not (l:=find(" ", datagram)) then l:=*datagram return datagram[2:l] end #validate command and service it method ExecuteCommand(L, Sockets, Users, buffer, i) local UserCmd if IsCommand(buffer) then { UserCmd := GetCommand(buffer) if ValidCommand(UserCmd) then { case UserCmd of { "say": ForwardMessage(L, Users, Sockets, buffer, i) default: write("Command not implemented yet.") } } else fail } else fail end #delete user from server & close conection method DeleteUser(L, Sockets, Users, i) local n, Xuser close(L[i]) Xuser := Sockets[L[i]].uid delete(Sockets, L[i]) every n := 1 to *Users do { if L[i] === Users[n] then{ delete(Users, n) break } } write("Deleted user ", Xuser, "\nNumber Users: ", *Users, "::" , *Sockets) end #write message to all other users method ForwardMessage(L, Users, Sockets, buffer, i) local x, newbuf, sender if *Users == 1 then write(L[i], "\\say No other users connected to talk to.") else{ sender := Sockets[L[i]].uid newbuf := "\\say "|| sender || ": " || GetMessage(buffer,6) every x := 1 to *Users do { if not (L[i] === Users[x]) then{ write(Users[x],newbuf) } } } end #get message from user input method GetMessage(datagram, l) return datagram[l:*datagram] end #check to see if message is a command method IsCommand(datagram) if datagram[1] == "\\" then return else fail end #check user command against set of available user commands method ValidCommand(usercmd) return member(commands,usercmd) end #validate command and service it method ClientCommand(buffer) local UserCmd if IsCommand(buffer) then { UserCmd := GetCommand(buffer) if ValidCommand(UserCmd) then { case UserCmd of { "say": ClientMessage(buffer,*UserCmd+3) default: ClientMessage("message processed, no command available",0) } } else fail } else fail end #write out available input for user to read method ClientMessage(buffer,n) if /handle_char then stop("can't call ClientMessage from server") handle_char(1,buffer[n:*buffer+1], "\n") end initially commands := set("afk", "cmd", "course", "disband","door","draw", "emote","enroll","erase","exit","follow","give", "group","hand","ignore","invite","join","kill", "loc","lock","log","login","move","pen","quit!", "say","sound","stop","take","tell","video", "voice","who") end