Now most of GGSChat uses the GGS protocol both ways

This commit is contained in:
Jonatan Pålsson 2011-02-28 12:56:23 +01:00
parent 9ff48a90b3
commit 6986bc269f
4 changed files with 64 additions and 17 deletions

View file

@ -38,7 +38,7 @@ class GGSChat:
self.wTree.get_widget("window1").show() self.wTree.get_widget("window1").show()
self.wTree.get_widget("entry").grab_focus() self.wTree.get_widget("entry").grab_focus()
nicksList = self.wTree.get_widget("nicksList") nicksList = self.wTree.get_widget("nicksList")
self.changeNick() #self.changeNick()
nicksList.set_model(self.nicksListStore) nicksList.set_model(self.nicksListStore)
# self.nicksListStore.append(["Test!"]) # self.nicksListStore.append(["Test!"])
@ -91,25 +91,50 @@ class GGSChat:
PORT = port # The same port as used by the server PORT = port # The same port as used by the server
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect((HOST, PORT)) self.s.connect((HOST, PORT))
self.token = self.s.recv(1024)
self.setStatus("Connected!") 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): def listenChat(self):
msg = {}
print "listening" print "listening"
fs = self.s.makefile() fs = self.s.makefile()
while True: while True:
line = fs.readline() line = fs.readline()
print "Received: ", line print "Received: '%s'" % line
if line.split(" ")[0] == "LUSERS": if line != "\n":
gobject.idle_add(self.updateUsers, line) key = line.split(":")[0]
value = line.split(":")[1]
msg[key] = value.strip()
else: 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): def updateChatText(self, text):
self.wTree.get_widget("chatBox").get_buffer().insert_at_cursor(text) self.wTree.get_widget("chatBox").get_buffer().insert_at_cursor(text)
def luserCheck(self): def luserCheck(self):
while True: while True:
if self.token == None:
print "Not sending lusers cmd.."
continue
print "Sending lusers cmd.."
self.s.send("Game-Command: lusers\n" + self.s.send("Game-Command: lusers\n" +
"Token: %s\n" % self.token + "Token: %s\n" % self.token +
"Content-Type: text\n" + "Content-Type: text\n" +
@ -118,8 +143,7 @@ class GGSChat:
time.sleep(2) time.sleep(2)
def updateUsers(self, text): def updateUsers(self, text):
nicks = ' '.join(text.split(" ")[1:]) evalNicks = eval(text)
evalNicks = eval(nicks)
self.nicksListStore.clear() self.nicksListStore.clear()
for nick in evalNicks: for nick in evalNicks:
self.nicksListStore.append([nick]) self.nicksListStore.append([nick])

View file

@ -44,17 +44,23 @@ loop(Table) ->
do_stuff(Command, Args, PlayerToken, Table) -> do_stuff(Command, Args, PlayerToken, Table) ->
case Command of case Command of
"greet" -> "greet" ->
ggs_table:notify_player(Table, PlayerToken, server, "Hello there!\n"); ggs_table:notify_player(Table, PlayerToken, server, {"chat", "Hello there!\n"});
"chat" -> "chat" ->
Nick = ggs_db:getItem(Table, nicks, PlayerToken), case ggs_db:getItem(Table, nicks, PlayerToken) of
ggs_table:notify_all_players(Table, "<"++Nick++"> "++ Args ++ "\n"); {error} ->
Nick = "Noname";
Other ->
Nick = Other
end,
ggs_table:notify_all_players(Table, {"chat", "<"++Nick++"> "++ Args ++ "\n"});
"uname" -> "uname" ->
Uname = os:cmd("uname -a"), Uname = os:cmd("uname -a"),
ggs_table:notify_player(Table, PlayerToken, server, Uname); ggs_table:notify_player(Table, PlayerToken, server, {"chat", Uname});
"lusers" -> "lusers" ->
{ok, Players} = ggs_table:get_player_list(Table), {ok, Players} = ggs_table:get_player_list(Table),
Nicks = lists:map(fun (P) -> ggs_db:getItem(Table, nicks, P) end, Players), 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" -> "nick" ->
ggs_db:setItem(Table,nicks,PlayerToken,Args), ggs_db:setItem(Table,nicks,PlayerToken,Args),
io:format("Changing nickname of ~p to ~p.", [PlayerToken, Args]); io:format("Changing nickname of ~p to ~p.", [PlayerToken, Args]);

View file

@ -26,12 +26,12 @@ start_link(Socket) ->
TableStatus = ggs_coordinator:join_table(1337), TableStatus = ggs_coordinator:join_table(1337),
case TableStatus of case TableStatus of
{ok, Table} -> {ok, Table} ->
notify(self(), self(), Token), notify(self(), self(), {"hello", Token}),
loop(#pl_state{socket = Socket, token = Token, table = Table}); loop(#pl_state{socket = Socket, token = Token, table = Table});
{error, no_such_table} -> {error, no_such_table} ->
ggs_coordinator:create_table({force, 1337}), ggs_coordinator:create_table({force, 1337}),
{ok, Table} = ggs_coordinator:join_table(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}) loop(#pl_state{socket = Socket, token = Token, table = Table})
end. end.
@ -40,7 +40,10 @@ start_link(Socket) ->
%% @spec notify(Player::Pid(), From::Pid(), %% @spec notify(Player::Pid(), From::Pid(),
%% {Command::String(), Message::string()}) -> ok %% {Command::String(), Message::string()}) -> ok
notify(Player, From, Message) -> 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. %% @doc Get the player token uniquely representing the player.
%% @spec get_token() -> string() %% @spec get_token() -> string()
@ -60,7 +63,9 @@ loop(#pl_state{token = _Token, socket = Socket, table = Table} = State) ->
receive receive
{tcp, Socket, Data} -> % Just echo for now.. {tcp, Socket, Data} -> % Just echo for now..
io:format("Parsing via protocol module..~n"), io:format("Parsing via protocol module..~n"),
erlang:display(Data),
Parsed = ggs_protocol:parse(Data), Parsed = ggs_protocol:parse(Data),
erlang:display(Parsed),
self() ! Parsed, self() ! Parsed,
loop(State); loop(State);
{notify, _From, Message} -> {notify, _From, Message} ->

View file

@ -1,5 +1,5 @@
-module(ggs_protocol). -module(ggs_protocol).
-export([parse/1, getToken/1]). -export([parse/1, getToken/1, create_message/4]).
%% API Functions %% API Functions
parse(Data) -> parse(Data) ->
@ -14,6 +14,18 @@ getToken(Parsed) ->
false false
end. 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 %% Internal helpers
do_parse(Data, ParsedMessage) -> do_parse(Data, ParsedMessage) ->
NewLinePos = string:chr(Data, $\n), NewLinePos = string:chr(Data, $\n),