From 1af6a1e3eb3a6b9d4af180fb93463827954bcb30 Mon Sep 17 00:00:00 2001 From: drymer Date: Tue, 17 May 2016 23:03:45 +0200 Subject: [PATCH] Change connection paradigm Last version was thought to be used with all the .ini that it was need. Now it only uses one and it links the groups with muc index. --- jabbergram.py | 105 +++++++++++++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 39 deletions(-) diff --git a/jabbergram.py b/jabbergram.py index c4be547..74e28be 100755 --- a/jabbergram.py +++ b/jabbergram.py @@ -13,25 +13,27 @@ from sys import exit class EchoBot(sleekxmpp.ClientXMPP): - def __init__(self, jid, password, room, nick, token, group): + def __init__(self, jid, password, rooms, nick, token, groups): # XMPP super(EchoBot, self).__init__(jid, password) self.add_event_handler('session_start', self.start) self.add_event_handler('groupchat_message', self.muc_message) - self.add_event_handler("muc::%s::got_online" % room, - self.muc_online) - self.add_event_handler("muc::%s::got_offline" % room, - self.muc_offline) - self.muc_room = room + self.muc_rooms = rooms.split() self.nick = nick self.token = token - self.xmpp_users = [] + self.xmpp_users = {} + + for muc in self.muc_rooms: + self.add_event_handler("muc::%s::got_online" % muc, + self.muc_online) + self.add_event_handler("muc::%s::got_offline" % muc, + self.muc_offline) # Telegram - self.group = group + self.groups = groups.split() self.bot = telegram.Bot(self.token) - self.telegram_users = [] + self.telegram_users = {} # meter el conecto del tg en un hilo t = Thread(target=self.read_tg) @@ -51,66 +53,91 @@ class EchoBot(sleekxmpp.ClientXMPP): message = update.message.text user = str(update.message.from_user.username) + # sometimes there's no user. weird, but it happens if not user: user = str(update.message.from_user.first_name) msg = user + ": " + message chat_id = update.message.chat_id - if message and chat_id == self.group: - if user not in self.telegram_users: - self.telegram_users.append(user) + if message: + index = self.groups.index(str(chat_id)) + receiver = self.muc_rooms[index] + + if chat_id in self.telegram_users: + if user not in self.telegram_users[chat_id]: + self.telegram_users[chat_id] += ' ' + user + else: + self.telegram_users[chat_id] = ' ' + user if message == '.users': - self.say_users('telegram') - + index = self.groups.index(str(chat_id)) + muc = self.muc_rooms[index] + self.say_users('telegram', muc, chat_id) else: - self.send_message(mto=self.muc_room, - mbody=msg, + self.send_message(mto=receiver, mbody=msg, mtype='groupchat') update_id = update.update_id + 1 - except NetworkError: + except NetworkError as e: sleep(1) + except Unauthorized: sleep(1) def start(self, event): self.get_roster() self.send_presence() - self.plugin['xep_0045'].joinMUC(self.muc_room, self.nick, wait=True) + + for muc in self.muc_rooms: + self.plugin['xep_0045'].joinMUC(muc, self.nick, wait=True) def muc_message(self, msg): + muc_room = str(msg['from']).split('/')[0] + index = self.muc_rooms.index(muc_room) + tg_group = self.groups[index] + if msg['body'] == '.users': - self.say_users('xmpp') + self.say_users('xmpp', muc_room, tg_group) elif msg['mucnick'] != self.nick: message = str(msg['from']).split('/')[1] + ': ' + str(msg['body']) - self.bot.sendMessage(self.group, text=message) - + self.bot.sendMessage(tg_group, text=message) def muc_online(self, presence): - if presence['muc']['nick'] != self.nick: - self.xmpp_users.append(presence['muc']['nick']) + user = presence['muc']['nick'] + muc = presence['from'].bare + + if user != self.nick: + if muc in self.xmpp_users: + self.xmpp_users[muc].append(presence['muc']['nick']) + else: + self.xmpp_users[muc] = [presence['muc']['nick']] def muc_offline(self, presence): - if presence['muc']['nick'] != self.nick: - self.xmpp_users.remove(presence['muc']['nick']) + user = presence['muc']['nick'] + muc = presence['from'].bare - def say_users(self, service): + if user != self.nick: + self.xmpp_users[muc].pop(presence['muc']['nick']) + + def say_users(self, service, muc, group): xmpp_users = "" tg_users = "" + group = int(group) - for i in self.xmpp_users: - xmpp_users = xmpp_users + ' _' + i + if muc in self.xmpp_users: + for i in self.xmpp_users[muc]: + xmpp_users = xmpp_users + ' _' + i + else: + xmpp_users = "" msg1 = 'XMPP Users:' + xmpp_users - for i in self.telegram_users: - tg_users = tg_users + ' ' + i - - if not tg_users: + if group in self.telegram_users: + tg_users = self.telegram_users[group] + else: tg_users = "" msg2 = 'Telegram Users:' + tg_users @@ -118,11 +145,11 @@ class EchoBot(sleekxmpp.ClientXMPP): message = msg1 + '\n' + msg2 if service == 'xmpp': - self.send_message(mto=self.muc_room, - mbody=message, - mtype='groupchat') + self.send_message(mto=muc, mbody=message, mtype='groupchat') + # arreglar el .users por el lado de tg elif service == 'telegram': - self.bot.sendMessage(self.group, text=message) + self.bot.sendMessage(group, text=message) + if __name__ == '__main__': @@ -141,12 +168,12 @@ if __name__ == '__main__': # asignar valores para el bot jid = config[0] password = config[1] - muc_room = config[2] + muc_rooms = config[2] nick = config[3] token = config[4] - group = int(config[5]) + groups = config[5] - xmpp = EchoBot(jid, password, muc_room, nick, token, group) + xmpp = EchoBot(jid, password, muc_rooms, nick, token, groups) xmpp.register_plugin('xep_0045') if xmpp.connect():