Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "Persist UIDs received from Telegram" #5231

Merged
merged 1 commit into from
Sep 6, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 8 additions & 71 deletions pokemongo_bot/event_handlers/telegram_handler.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
import telegram
import thread
import re
from pokemongo_bot.datastore import Datastore


DEBUG_ON = False

Expand All @@ -21,36 +19,7 @@ class TelegramClass:

def __init__(self, bot, master, pokemons, config):
self.bot = bot
with self.bot.database as conn:
# initialize the DB table if it does not exist yet
cur = conn.cursor()
try:
cur.executescript("""
create table if not exists telegram_uids(uid text constraint upk primary key, username text not null);
create index if not exists tuids_username on telegram_uids(username);
""")
except sqlite3.Error as e:
self.bot.logger.warn("An error occurred while initializing Telegram UID table: {}".format(e.args[0]))


# if master is not numeric, try to fetch it from the database
if re.match(r'^[0-9]+$', str(master)): # master is numeric
self.master = master
self.bot.logger.info("Telegram master is valid (numeric): {}".format(master))
else:
self.bot.logger.info("Telegram master is not numeric: {}".format(master))
c = conn.cursor()
# do we already have a user id?
srchmaster = re.sub(r'^@', '', master)
c.execute("SELECT uid from telegram_uids where username in ('{}', '@{}')".format(srchmaster, srchmaster))
results = c.fetchall()
if len(results) > 0: # woohoo, we already saw a message from this master and therefore have a uid
self.bot.logger.info("Telegram master UID from datastore: {}".format(results[0][0]))
self.master = results[0][0]
else: # uid not known yet
self.bot.logger.info("Telegram master UID not in datastore yet")
self.master = master

self.master = master
self.pokemons = pokemons
self._tbot = None
self.config = config
Expand Down Expand Up @@ -115,36 +84,27 @@ def send_player_stats_to_chat(self, chat_id):
self.sendLocation(chat_id=chat_id, latitude=self.bot.api._position_lat, longitude=self.bot.api._position_lng)
else:
self.sendMessage(chat_id=chat_id, parse_mode='Markdown', text="Stats not loaded yet\n")
def grab_uid(self, update):
with self.bot.database as conn:
conn.execute("replace into telegram_uids (uid, username) values (?, ?)", (update.message.chat_id, update.message.from_user.username))
conn.commit()

def run(self):
time.sleep(1)
while True:
for update in self._tbot.getUpdates(offset=self.update_id, timeout=10):
self.update_id = update.update_id+1
if update.message:
self.bot.logger.info("Telegram message from {} ({}): {}".format(update.message.from_user.username, update.message.from_user.id, update.message.text))
self.bot.logger.info("message from {} ({}): {}".format(update.message.from_user.username, update.message.from_user.id, update.message.text))
if not self.master:
# Reject message if no master defined in config
outMessage = "Telegram bot setup not yet complete (master = null). Please enter your userid ({}) or your username (@{}) as master in bot configuration file (config section of TelegramTask).".format(update.message.from_user.id)
outMessage = "Telegram bot setup not yet complete (master = null). Please enter your userid {} into bot configuration file.".format(update.message.from_user.id)
self.bot.logger.warn(outMessage)
continue
if str(self.master) not in [str(update.message.from_user.id), "@{}".format(update.message.from_user.username), update.message.from_user.username]:
if self.master not in [update.message.from_user.id, "@{}".format(update.message.from_user.username)]:
# Reject message if sender does not match defined master in config
outMessage = "Telegram message received from unknown sender. If this was you, please enter your userid ({}) or your username (@{}) as master in bot configuration file (config section of TelegramTask); current value there: {}.".format(update.message.from_user.id, update.message.from_user.username, self.master)
outMessage = "Telegram message received from unknown sender. If this was you, please enter your userid {} as master in bot configuration file.".format(update.message.from_user.id)
self.bot.logger.warn(outMessage)
continue
if self.master and not re.match(r'^[0-9]+$', str(self.master)):
outMessage = "Telegram message received from correct user, but master is not numeric, updating datastore."
self.bot.logger.warn(outMessage)
# the "master" is not numeric, set self.master to update.message.chat_id and re-instantiate the handler
newconfig = self.config
newconfig['master'] = update.message.chat_id
# insert chat id into database
self.grab_uid(update)
# remove old handler
self.bot.event_manager._handlers = filter(lambda x: not isinstance(x, TelegramHandler), self.bot.event_manager._handlers)
# add new handler (passing newconfig as parameter)
Expand All @@ -164,57 +124,34 @@ class TelegramHandler(EventHandler):
def __init__(self, bot, config):
self.bot = bot
self.tbot = None
master = config.get('master', None)
self.master = config.get('master', None)
self.pokemons = config.get('alert_catch', {})
self.whoami = "TelegramHandler"
self.config = config
if master == None:
self.master = None
return

with self.bot.database as conn:
# if master is not numeric, try to fetch it from the database
if not re.match(r'^[0-9]+$', str(master)): # master is numeric
self.bot.logger.info("Telegram master is not numeric: {}".format(master))
c = conn.cursor()
# do we already have a user id?
srchmaster = re.sub(r'^@', '', master)
c.execute("SELECT uid from telegram_uids where username in ('{}', '@{}')".format(srchmaster, srchmaster))
results = c.fetchall()
if len(results) > 0: # woohoo, we already saw a message from this master and therefore have a uid
self.bot.logger.info("Telegram master UID from datastore: {}".format(results[0][0]))
self.master = results[0][0]
else: # uid not known yet
self.bot.logger.info("Telegram master UID not in datastore yet")
self.master = master

def handle_event(self, event, sender, level, formatted_msg, data):
if self.tbot is None:
try:
self.bot.logger.info("Telegram bot not running, trying to spin it up")
self.tbot = TelegramClass(self.bot, self.master, self.pokemons, self.config)
self.tbot.connect()
thread.start_new_thread(self.tbot.run)
except Exception as inst:
self.tbot = None
self.bot.logger.error("Unable to spin Telegram bot; master: {}".format(self.master))
return
if self.master:
if not re.match(r'^[0-9]+$', str(self.master)):
# master not numeric?...
self.bot.logger.info("Telegram master not numeric: {}".format(self.master, type(self.master)))
return
master = self.master

if event == 'level_up':
msg = "level up ({})".format(data["current_level"])
elif event == 'pokemon_caught':
if isinstance(self.pokemons, list): # alert_catch is a plain list
if isinstance(self.pokemons, list):
if data["pokemon"] in self.pokemons or "all" in self.pokemons:
msg = "Caught {} CP: {}, IV: {}".format(data["pokemon"], data["cp"], data["iv"])
else:
return
else: # alert_catch is a dict
else:
if data["pokemon"] in self.pokemons:
trigger = self.pokemons[data["pokemon"]]
elif "all" in self.pokemons:
Expand Down