Fix bug in ipstamp module.

Sync with server. Refs #2307.

This was SVN commit r14363.
This commit is contained in:
leper 2013-12-15 18:33:01 +00:00
parent 79252043ae
commit d2e671392b
2 changed files with 49 additions and 37 deletions

View File

@ -479,15 +479,15 @@ class XpartaMuPP(sleekxmpp.ClientXMPP):
"""
pass
elif iq['type'] == 'set':
if 'gamelist|en' in iq.values:
if 'gamelist' in iq.values:
"""
Register-update / unregister a game
"""
command = iq['gamelist|en']['command']
command = iq['gamelist']['command']
if command == 'register':
# Add game
try:
self.gameList.addGame(iq['from'], iq['gamelist|en']['game'])
self.gameList.addGame(iq['from'], iq['gamelist']['game'])
self.sendGameList()
except:
traceback.print_exc()
@ -504,19 +504,19 @@ class XpartaMuPP(sleekxmpp.ClientXMPP):
elif command == 'changestate':
# Change game status (waiting/running)
try:
self.gameList.changeGameState(iq['from'], iq['gamelist|en']['game'])
self.gameList.changeGameState(iq['from'], iq['gamelist']['game'])
self.sendGameList()
except:
traceback.print_exc()
logging.error("Failed to process changestate data")
else:
logging.error("Failed to process command '%s' received from %s" % command, iq['from'].bare)
elif 'gamereport|en' in iq.values:
elif 'gamereport' in iq.values:
"""
Client is reporting end of game statistics
"""
try:
self.reportManager.addReport(iq['from'], iq['gamereport|en']['game'])
self.reportManager.addReport(iq['from'], iq['gamereport']['game'])
if self.leaderboard.getLastRatedMessage() != "":
self.send_message(mto=self.room, mbody=self.leaderboard.getLastRatedMessage(), mtype="groupchat",
mnick=self.nick)
@ -647,6 +647,6 @@ if __name__ == '__main__':
xmpp.register_plugin('xep_0199') # XMPP Ping
if xmpp.connect():
xmpp.process(block=False)
xmpp.process(threaded=False)
else:
logging.error("Unable to connect")

View File

@ -13,6 +13,7 @@
%%
%% You should have received a copy of the GNU General Public License
%% along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
-module(mod_ipstamp).
-behaviour(gen_mod).
@ -25,52 +26,63 @@
-define (Domain, "lobby.wildfiregames.com").
%% Login of the Xpartamupp jabber client
-define (XpartamuppLogin, "xpartamupp").
%% TODO: It would be nice to get this from the module options.
-define (XpartamuppLogin, "wfgbot").
start(_Host, _Opts) ->
?INFO_MSG("mod_ipip starting", []),
?INFO_MSG("mod_ipstamp starting", []),
ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 50),
ok.
stop(_Host) ->
?INFO_MSG("mod_ipstamp stopping", []),
ejabberd_hooks:delete(filter_packet, global, ?MODULE, on_filter_packet, 50),
ok.
on_filter_packet({From, To, Packet} = Input) ->
{_,STo,_,_,_,_,_} = To,
{_,SElement,LPacketInfo,LPacketQuery} = Packet,
{_,SFrom,_,_,_,_,_} = From,
if STo == "xpartamupp" ->
{_,SElement,LPacketInfo,LPacketQuery} = Packet,
if SElement == "iq" ->
{_,STo,_,_,_,_,_} = To,
%% We only want to do something for the bot
if STo == ?XpartamuppLogin ->
if SElement == "iq" ->
%% Get iq type (get/set/result...).
{_, SType} = lists:keyfind("type",1,LPacketInfo),
if SType == "set" ->
{_,_,LXmlns,LGame} = lists:keyfind("query",2,LPacketQuery),
%% Get the sender's IP for later.
Info = ejabberd_sm:get_user_info(SFrom,[?Domain],"0ad"),
{ip, {Ploc, _Port}} = lists:keyfind(ip, 1, Info),
SIp = inet_parse:ntoa(Ploc),
%% Get XMLNS and message body (we assume the first xml element contains the xmlns).
{_,_,LXmlns,LBody} = lists:keyfind(xmlelement,1,LPacketQuery),
{_,SXmlns} = lists:keyfind("xmlns",1,LXmlns),
%% Insert IP into game registration requests.
if SXmlns == "jabber:iq:gamelist" ->
{_,_,_,LCommand} = lists:keyfind("command",2,LGame),
{_,_,_,LCommand} = lists:keyfind("command",2,LBody),
{_,SCommand} = lists:keyfind(xmlcdata,1,LCommand),
if SCommand == <<"register">> ->
{_,_,KGame,_} = lists:keyfind("game",2,LGame),
Info = ejabberd_sm:get_user_info(SFrom,[?Domain],"0ad"),
{ip, {Ploc, _Port}} = lists:keyfind(ip, 1, Info),
SIp = inet_parse:ntoa(Ploc),
?INFO_MSG(string:concat("stamp ip: ",SIp), []),
{From,To,{xmlelement,"iq",LPacketInfo,[
{xmlelement,"query",[{"xmlns","jabber:iq:gamelist"}],[
{xmlelement,"game",lists:keyreplace("ip",1,KGame,{"ip",SIp}),[]},
{xmlelement,"command",[],[{xmlcdata,<<"register">>}]}
]
}
]}}
; true -> Input
end
; true -> Input
end
; true -> Input
end
; true -> Input
end
; true -> Input
{_,_,KGame,_} = lists:keyfind("game",2,LBody),
?INFO_MSG(string:concat("Inserting IP into game registration stanza: ",SIp), []),
{From,To,{xmlelement,"iq",LPacketInfo,[
{xmlelement,"query",[{"xmlns","jabber:iq:gamelist"}],[
{xmlelement,"game",lists:keyreplace("ip",1,KGame,{"ip",SIp}),[]},
{xmlelement,"command",[],[{xmlcdata,<<"register">>}]}
]
}
]}};
true ->
Input
end;
true ->
Input
end;
true ->
Input
end;
true ->
Input
end;
true ->
Input
end.