Now most of GGSChat uses the GGS protocol both ways
This commit is contained in:
parent
9ff48a90b3
commit
6986bc269f
4 changed files with 64 additions and 17 deletions
|
@ -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])
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
|
@ -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} ->
|
||||||
|
|
|
@ -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),
|
||||||
|
|
Reference in a new issue