diff --git a/games/GGSChat/chat.py b/games/GGSChat/chat.py index 5dc6fd0..9899cbb 100644 --- a/games/GGSChat/chat.py +++ b/games/GGSChat/chat.py @@ -38,7 +38,7 @@ class GGSChat: self.wTree.get_widget("window1").show() self.wTree.get_widget("entry").grab_focus() nicksList = self.wTree.get_widget("nicksList") - self.changeNick() + #self.changeNick() nicksList.set_model(self.nicksListStore) # self.nicksListStore.append(["Test!"]) @@ -91,25 +91,50 @@ class GGSChat: PORT = port # The same port as used by the server self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.connect((HOST, PORT)) - self.token = self.s.recv(1024) self.setStatus("Connected!") + + def protocolHandler(self, msg): + if msg["Client-Command"] == "hello": + self.token = msg["DATA"] + elif msg["Client-Command"] == "chat": + gobject.idle_add(self.updateChatText, msg["DATA"]) + elif msg["Client-Command"] == "lusers": + print msg + gobject.idle_add(self.updateUsers, msg["DATA"]) + + def listenChat(self): + msg = {} print "listening" fs = self.s.makefile() while True: line = fs.readline() - print "Received: ", line - if line.split(" ")[0] == "LUSERS": - gobject.idle_add(self.updateUsers, line) + print "Received: '%s'" % line + if line != "\n": + key = line.split(":")[0] + value = line.split(":")[1] + msg[key] = value.strip() else: - gobject.idle_add(self.updateChatText, line) + msg["DATA"] = fs.read(int("%s" % msg["Content-Size"])) + print "Got data:", msg + self.protocolHandler(msg) + #gobject.idle_add(self.updateChatText, msg["DATA"]) + +# if line.split(" ")[0] == "LUSERS": +# gobject.idle_add(self.updateUsers, line) +# else: +# print msg def updateChatText(self, text): self.wTree.get_widget("chatBox").get_buffer().insert_at_cursor(text) def luserCheck(self): while True: + if self.token == None: + print "Not sending lusers cmd.." + continue + print "Sending lusers cmd.." self.s.send("Game-Command: lusers\n" + "Token: %s\n" % self.token + "Content-Type: text\n" + @@ -118,8 +143,7 @@ class GGSChat: time.sleep(2) def updateUsers(self, text): - nicks = ' '.join(text.split(" ")[1:]) - evalNicks = eval(nicks) + evalNicks = eval(text) self.nicksListStore.clear() for nick in evalNicks: self.nicksListStore.append([nick]) diff --git a/src/ggs_gamevm_e.erl b/src/ggs_gamevm_e.erl index 3efab48..1ac9fc0 100644 --- a/src/ggs_gamevm_e.erl +++ b/src/ggs_gamevm_e.erl @@ -44,17 +44,23 @@ loop(Table) -> do_stuff(Command, Args, PlayerToken, Table) -> case Command of "greet" -> - ggs_table:notify_player(Table, PlayerToken, server, "Hello there!\n"); + ggs_table:notify_player(Table, PlayerToken, server, {"chat", "Hello there!\n"}); "chat" -> - Nick = ggs_db:getItem(Table, nicks, PlayerToken), - ggs_table:notify_all_players(Table, "<"++Nick++"> "++ Args ++ "\n"); + case ggs_db:getItem(Table, nicks, PlayerToken) of + {error} -> + Nick = "Noname"; + Other -> + Nick = Other + end, + ggs_table:notify_all_players(Table, {"chat", "<"++Nick++"> "++ Args ++ "\n"}); "uname" -> Uname = os:cmd("uname -a"), - ggs_table:notify_player(Table, PlayerToken, server, Uname); + ggs_table:notify_player(Table, PlayerToken, server, {"chat", Uname}); "lusers" -> {ok, Players} = ggs_table:get_player_list(Table), Nicks = lists:map(fun (P) -> ggs_db:getItem(Table, nicks, P) end, Players), - ggs_table:notify_player(Table, PlayerToken, server,io_lib:format("LUSERS ~p\n",[Nicks])); + ggs_table:notify_player(Table, PlayerToken, server, + {"lusers", io_lib:format("~p\n",[Nicks])}); "nick" -> ggs_db:setItem(Table,nicks,PlayerToken,Args), io:format("Changing nickname of ~p to ~p.", [PlayerToken, Args]); diff --git a/src/ggs_player.erl b/src/ggs_player.erl index 0211f3f..467e3ac 100644 --- a/src/ggs_player.erl +++ b/src/ggs_player.erl @@ -26,12 +26,12 @@ start_link(Socket) -> TableStatus = ggs_coordinator:join_table(1337), case TableStatus of {ok, Table} -> - notify(self(), self(), Token), + notify(self(), self(), {"hello", Token}), loop(#pl_state{socket = Socket, token = Token, table = Table}); {error, no_such_table} -> ggs_coordinator:create_table({force, 1337}), {ok, Table} = ggs_coordinator:join_table(1337), - notify(self(), self(), Token), + notify(self(), self(), {"hello", Token}), loop(#pl_state{socket = Socket, token = Token, table = Table}) end. @@ -40,7 +40,10 @@ start_link(Socket) -> %% @spec notify(Player::Pid(), From::Pid(), %% {Command::String(), Message::string()}) -> ok notify(Player, From, Message) -> - Player ! {notify, From, Message}. + erlang:display(Message), + {Cmd, Data} = Message, + Parsed = ggs_protocol:create_message(Cmd, "text","text", Data), + Player ! {notify, From, Parsed}. %% @doc Get the player token uniquely representing the player. %% @spec get_token() -> string() @@ -60,7 +63,9 @@ loop(#pl_state{token = _Token, socket = Socket, table = Table} = State) -> receive {tcp, Socket, Data} -> % Just echo for now.. io:format("Parsing via protocol module..~n"), + erlang:display(Data), Parsed = ggs_protocol:parse(Data), + erlang:display(Parsed), self() ! Parsed, loop(State); {notify, _From, Message} -> diff --git a/src/ggs_protocol.erl b/src/ggs_protocol.erl index 3dc88f9..d61dfc0 100644 --- a/src/ggs_protocol.erl +++ b/src/ggs_protocol.erl @@ -1,5 +1,5 @@ -module(ggs_protocol). --export([parse/1, getToken/1]). +-export([parse/1, getToken/1, create_message/4]). %% API Functions parse(Data) -> @@ -14,6 +14,18 @@ getToken(Parsed) -> false end. +create_message(Cmd, Enc, Acc, Data) -> + Length = integer_to_list(string:len(Data)), + Msg = "Client-Command: " ++ Cmd ++ "\n" ++ + "Client-Encoding: " ++ Enc ++ "\n" ++ + "Content-Size: " ++ Length ++ "\n" ++ + "GGS-Version: 1.0\n" ++ + "Accept: " ++ Acc ++ "\n" ++ + "\n" ++ + Data, + Msg. + + %% Internal helpers do_parse(Data, ParsedMessage) -> NewLinePos = string:chr(Data, $\n),