Files
jabbergram/jabbergram.py
T

195 lines
5.9 KiB
Python
Raw Normal View History

2016-05-08 18:46:24 +02:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sleekxmpp
import telegram
import configparser
from threading import Thread
from queue import Queue
from telegram.error import NetworkError, Unauthorized
from time import sleep
from sys import argv
2016-05-08 23:59:47 +02:00
from sys import exit
2016-05-08 18:46:24 +02:00
2016-09-23 21:36:46 +02:00
class jabbegram(sleekxmpp.ClientXMPP):
2016-05-17 23:03:45 +02:00
def __init__(self, jid, password, rooms, nick, token, groups):
2016-05-08 18:46:24 +02:00
# XMPP
2016-09-23 21:36:46 +02:00
super(jabbergram, self).__init__(jid, password)
2016-05-08 18:46:24 +02:00
self.add_event_handler('session_start', self.start)
self.add_event_handler('groupchat_message', self.muc_message)
2016-05-13 00:23:23 +02:00
2016-05-17 23:03:45 +02:00
self.muc_rooms = rooms.split()
2016-05-08 18:46:24 +02:00
self.nick = nick
self.token = token
2016-05-17 23:03:45 +02:00
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)
2016-05-08 18:46:24 +02:00
# Telegram
2016-05-17 23:03:45 +02:00
self.groups = groups.split()
2016-05-08 18:46:24 +02:00
self.bot = telegram.Bot(self.token)
2016-05-17 23:03:45 +02:00
self.telegram_users = {}
2016-05-08 18:46:24 +02:00
2016-09-23 21:36:46 +02:00
# put tg connector in a thread
2016-05-08 18:46:24 +02:00
t = Thread(target=self.read_tg)
t.daemon = True
t.start()
print('Please wait a couple of minutes until it\'s correctly '
'connected')
2016-05-08 18:46:24 +02:00
def read_tg(self):
update_id = 0
while True:
try:
for update in self.bot.getUpdates(offset=update_id,
timeout=10):
message = update.message.text
user = str(update.message.from_user.username)
2016-05-08 23:12:04 +02:00
2016-05-17 23:03:45 +02:00
# sometimes there's no user. weird, but it happens
2016-05-08 18:46:24 +02:00
if not user:
user = str(update.message.from_user.first_name)
2016-05-08 23:12:04 +02:00
2016-09-23 21:36:46 +02:00
# even weirder is that none of them exist
# let's take last_name
if not user:
user = str(update.message.from_user.last_name)
2016-05-13 00:23:23 +02:00
msg = user + ": " + message
2016-05-08 18:46:24 +02:00
chat_id = update.message.chat_id
2016-05-23 12:48:58 +02:00
if message and str(chat_id) in self.groups:
2016-05-17 23:03:45 +02:00
index = self.groups.index(str(chat_id))
receiver = self.muc_rooms[index]
2016-05-13 00:23:23 +02:00
2016-05-17 23:03:45 +02:00
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
2016-05-13 00:23:23 +02:00
2016-05-17 23:03:45 +02:00
if message == '.users':
index = self.groups.index(str(chat_id))
muc = self.muc_rooms[index]
self.say_users('telegram', muc, chat_id)
2016-05-13 00:23:23 +02:00
else:
2016-05-17 23:03:45 +02:00
self.send_message(mto=receiver, mbody=msg,
2016-05-13 00:23:23 +02:00
mtype='groupchat')
update_id = update.update_id + 1
2016-05-08 23:12:04 +02:00
2016-05-17 23:03:45 +02:00
except NetworkError as e:
2016-05-08 18:46:24 +02:00
sleep(1)
2016-05-17 23:03:45 +02:00
2016-05-08 18:46:24 +02:00
except Unauthorized:
2016-05-08 23:12:04 +02:00
sleep(1)
2016-05-08 18:46:24 +02:00
2016-06-04 18:09:14 +02:00
except Exception as e:
2016-09-23 21:36:46 +02:00
update_id += 1
2016-06-04 18:09:14 +02:00
print(e)
2016-05-08 18:46:24 +02:00
def start(self, event):
self.get_roster()
self.send_presence()
2016-05-17 23:03:45 +02:00
for muc in self.muc_rooms:
self.plugin['xep_0045'].joinMUC(muc, self.nick, wait=True)
2016-05-08 18:46:24 +02:00
def muc_message(self, msg):
2016-05-17 23:03:45 +02:00
muc_room = str(msg['from']).split('/')[0]
index = self.muc_rooms.index(muc_room)
tg_group = self.groups[index]
2016-05-13 00:23:23 +02:00
if msg['body'] == '.users':
2016-05-17 23:03:45 +02:00
self.say_users('xmpp', muc_room, tg_group)
2016-05-13 00:23:23 +02:00
elif msg['mucnick'] != self.nick:
message = str(msg['from']).split('/')[1] + ': ' + str(msg['body'])
2016-05-17 23:03:45 +02:00
self.bot.sendMessage(tg_group, text=message)
2016-05-13 00:23:23 +02:00
def muc_online(self, presence):
2016-05-17 23:03:45 +02:00
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']]
2016-05-13 00:23:23 +02:00
def muc_offline(self, presence):
2016-05-17 23:03:45 +02:00
user = presence['muc']['nick']
muc = presence['from'].bare
2016-05-13 00:23:23 +02:00
2016-05-17 23:03:45 +02:00
if user != self.nick:
2016-06-04 18:09:14 +02:00
self.xmpp_users[muc].remove(presence['muc']['nick'])
2016-05-17 23:03:45 +02:00
def say_users(self, service, muc, group):
2016-05-13 00:23:23 +02:00
xmpp_users = ""
tg_users = ""
2016-05-17 23:03:45 +02:00
group = int(group)
2016-05-13 00:23:23 +02:00
2016-05-17 23:03:45 +02:00
if muc in self.xmpp_users:
for i in self.xmpp_users[muc]:
xmpp_users = xmpp_users + ' _' + i
else:
xmpp_users = ""
2016-05-13 00:23:23 +02:00
msg1 = 'XMPP Users:' + xmpp_users
2016-05-17 23:03:45 +02:00
if group in self.telegram_users:
tg_users = self.telegram_users[group]
else:
2016-05-13 00:23:23 +02:00
tg_users = ""
msg2 = 'Telegram Users:' + tg_users
message = msg1 + '\n' + msg2
if service == 'xmpp':
2016-05-17 23:03:45 +02:00
self.send_message(mto=muc, mbody=message, mtype='groupchat')
# arreglar el .users por el lado de tg
2016-05-13 00:23:23 +02:00
elif service == 'telegram':
2016-05-17 23:03:45 +02:00
self.bot.sendMessage(group, text=message)
2016-05-08 18:46:24 +02:00
if __name__ == '__main__':
# parsear config
config = []
parser = configparser.SafeConfigParser()
if len(argv) == 2:
parser.read(argv[1])
else:
parser.read('config.ini')
for name, value in parser.items('config'):
config.append(value)
# asignar valores para el bot
jid = config[0]
password = config[1]
2016-05-17 23:03:45 +02:00
muc_rooms = config[2]
2016-05-08 18:46:24 +02:00
nick = config[3]
token = config[4]
2016-05-17 23:03:45 +02:00
groups = config[5]
2016-05-08 18:46:24 +02:00
2016-09-23 21:36:46 +02:00
xmpp = jabbergram(jid, password, muc_rooms, nick, token, groups)
2016-05-08 18:46:24 +02:00
xmpp.register_plugin('xep_0045')
if xmpp.connect():
xmpp.process(block=True)
print("Done")
else:
print("Unable to connect.")
# Vols un gram nen?