| 68 | | self.users = {} |
| | 70 | self.users = {} # contains the users list as keys |
| | 71 | self.rooms = {} # contains the rooms name as keys and the full JID of the participants as values |
| | 72 | |
| | 73 | def message_handler(self, con, msg): |
| | 74 | frm = msg.getFrom() |
| | 75 | frm_str = frm.getStripped() |
| | 76 | room = msg.getTo().getNode() |
| | 77 | room_jid = room+'@'+self.jid |
| | 78 | if not frm_str in self.users or self.users[frm_str]['room'] != room or self.users[frm_str]['nick'] is None: |
| | 79 | con.send(xmpp.Error(msg, 'item-not-found')) |
| | 80 | return |
| | 81 | if msg.getType() != 'groupchat': |
| | 82 | con.send(xmpp.Error(msg, 'bad-format')) |
| | 83 | |
| | 84 | message = xmpp.Message(body = msg.getBody(), typ='groupchat') |
| | 85 | for jid in self.rooms[room]: |
| | 86 | message.setTo(jid) |
| | 87 | if jid == frm: |
| | 88 | message.setFrom(room_jid+'/'+self.users[frm_str]['nick']) |
| | 89 | else: |
| | 90 | message.setFrom(room_jid+'/'+config.NICK_GUEST) |
| | 91 | con.send(message) |
| | 92 | |
| | 93 | |
| | 94 | def presence_handler(self, con, prs): |
| | 95 | frm = prs.getFrom() |
| | 96 | frm_str = frm.getStripped() |
| | 97 | room = prs.getTo().getNode() |
| | 98 | room_jid = room+'@'+self.jid |
| | 99 | nick = prs.getTo().getResource() |
| | 100 | if not frm_str in self.users or self.users[frm_str]['room'] != room: |
| | 101 | con.send(xmpp.Error(prs, 'item-not-found')) |
| | 102 | return |
| | 103 | if nick == '': |
| | 104 | con.send(xmpp.Error(prs, 'bad-format')) |
| | 105 | return |
| | 106 | |
| | 107 | user = self.users[frm_str] |
| | 108 | |
| | 109 | print user['nick'] |
| | 110 | if user['nick'] is not None and prs.getType() == 'available': # discard presence if the user is already in the chat |
| | 111 | return |
| | 112 | |
| | 113 | if user['nick'] is None: |
| | 114 | presence = xmpp.Presence(show = 'chat', payload = [xmpp.Node('x', attrs = {'xmlns': NS_MUC_USER})]) |
| | 115 | x = presence.getTag('x') |
| | 116 | x.addChild('item', attrs = {'affiliation': 'member', 'role': 'participant'}) |
| | 117 | if len(self.rooms[room]) == 1: |
| | 118 | presence.setTo(frm) |
| | 119 | presence.setFrom(room_jid+'/'+config.NICK_GUEST) |
| | 120 | con.send(presence) # sends the presence of the other participant to the current participant |
| | 121 | presence.setTo(self.rooms[room][0]) |
| | 122 | con.send(presence) # does the opposite |
| | 123 | presence.setTo(frm) |
| | 124 | presence.setFrom(room_jid+'/'+nick) |
| | 125 | x.addChild('status', attrs = {'code': '110'}) |
| | 126 | con.send(presence) # send the user self presence |
| | 127 | # add the user in the room |
| | 128 | user['nick'] = nick |
| | 129 | self.rooms[room].append(frm) |
| | 130 | else: # if the user is already in, and we are this far, that means that we got a presence type!= available, we assume that he has left the chat |
| | 131 | #TODO |
| | 132 | pass |
| | 133 | |