diff --git a/.gitignore b/.gitignore index 74d14ea..04473bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Never commit config data config.cnf +# Env vars for "real" installation +env.sh + # Byte-compiled / optimized / DLL files *.py[cod] diff --git a/bot.py b/bot.py index e8b1dea..c96a24e 100644 --- a/bot.py +++ b/bot.py @@ -23,12 +23,21 @@ class TelegramMonitorBot: def __init__(self): - self.debug = os.environ.get('DEBUG') is not None + self.debug = ( + (os.environ.get('DEBUG') is not None) and + (os.environ.get('DEBUG').upper() != "false")) - # Users to notify of violoations - self.notify_user_ids = ( - list(map(int, os.environ['NOTIFY_USER_IDS'].split(','))) - if "NOTIFY_USER_IDS" in os.environ else []) + if (self.debug): + print("🔵 DEBUG:", os.environ["DEBUG"]) + print("🔵 TELEGRAM_BOT_POSTGRES_URL:", os.environ["TELEGRAM_BOT_POSTGRES_URL"]) + print("🔵 TELEGRAM_BOT_TOKEN:", os.environ["TELEGRAM_BOT_TOKEN"]) + print("🔵 NOTIFY_CHAT:", os.environ['NOTIFY_CHAT'] if 'NOTIFY_CHAT' in os.environ else "") + print("🔵 MESSAGE_BAN_PATTERNS:\n", os.environ['MESSAGE_BAN_PATTERNS']) + print("🔵 MESSAGE_HIDE_PATTERNS:\n", os.environ['MESSAGE_HIDE_PATTERNS']) + print("🔵 NAME_BAN_PATTERNS:\n", os.environ['NAME_BAN_PATTERNS']) + + # Channel to notify of violoations, e.g. '@channelname' + self.notify_chat = os.environ['NOTIFY_CHAT'] if 'NOTIFY_CHAT' in os.environ else None # List of chat ids that bot should monitor self.chat_ids = ( @@ -75,15 +84,10 @@ class TelegramMonitorBot: + update.message.from_user.last_name) if self.name_ban_re and self.name_ban_re.search(full_name): # Logging - log_message = "Ban match full name: {}".format(full_name.encode('utf-8')) + log_message = "❌ 🙅‍♂️ BAN MATCH FULL NAME: {}".format(full_name.encode('utf-8')) if self.debug: update.message.reply_text(log_message) print(log_message) - for notify_user_id in self.notify_user_ids: - print (notify_user_id,"gets notified") - bot.send_message( - chat_id=notify_user_id, - text=log_message) # Ban the user self.ban_user(update) # Log in database @@ -94,17 +98,15 @@ class TelegramMonitorBot: s.add(userBan) s.commit() s.close() + # Notify channel + bot.sendMessage(chat_id=self.notify_chat, text=log_message) if self.name_ban_re and self.name_ban_re.search(update.message.from_user.username or ''): # Logging - log_message = "Ban match username: {}".format(update.message.from_user.username.encode('utf-8')) + log_message = "❌ 🙅‍♂️ BAN MATCH USERNAME: {}".format(update.message.from_user.username.encode('utf-8')) if self.debug: update.message.reply_text(log_message) print(log_message) - for notify_user_id in self.notify_user_ids: - bot.send_message( - chat_id=notify_user_id, - text=log_message) # Ban the user self.ban_user(update) # Log in database @@ -115,6 +117,8 @@ class TelegramMonitorBot: s.add(userBan) s.commit() s.close() + # Notify channel + bot.sendMessage(chat_id=self.notify_chat, text=log_message) def security_check_message(self, bot, update): @@ -125,16 +129,32 @@ class TelegramMonitorBot: # TODO: Replace lookalike unicode characters: # https://github.com/wanderingstan/Confusables - if self.message_ban_re and self.message_ban_re.search(message): + # Hide forwarded messages + if update.message.forward_date is not None: # Logging - log_message = "Ban message match: {}".format(update.message.text.encode('utf-8')) + log_message = "❌ HIDE FORWARDED: {}".format(update.message.text.encode('utf-8')) + if self.debug: + update.message.reply_text(log_message) + print(log_message) + # Delete the message + update.message.delete() + # Log in database + s = session() + messageHide = MessageHide( + user_id=update.message.from_user.id, + message=update.message.text) + s.add(messageHide) + s.commit() + s.close() + # Notify channel + bot.sendMessage(chat_id=self.notify_chat, text=log_message) + + if self.message_ban_re and self.message_ban_re.search(message): + # Logging + log_message = "❌ 🙅‍♂️ BAN MATCH: {}".format(update.message.text.encode('utf-8')) if self.debug: update.message.reply_text(log_message) print(log_message) - for notify_user_id in self.notify_user_ids: - bot.send_message( - chat_id=notify_user_id, - text=log_message) # Any message that causes a ban gets deleted update.message.delete() # Ban the user @@ -147,17 +167,15 @@ class TelegramMonitorBot: s.add(userBan) s.commit() s.close() + # Notify channel + bot.sendMessage(chat_id=self.notify_chat, text=log_message) elif self.message_hide_re and self.message_hide_re.search(message): # Logging - log_message = "Hide match: {}".format(update.message.text.encode('utf-8')) + log_message = "❌ 🙈 HIDE MATCH: {}".format(update.message.text.encode('utf-8')) if self.debug: update.message.reply_text(log_message) print(log_message) - for notify_user_id in self.notify_user_ids: - bot.send_message( - chat_id=notify_user_id, - text=log_message) # Delete the message update.message.delete() # Log in database @@ -168,6 +186,8 @@ class TelegramMonitorBot: s.add(messageHide) s.commit() s.close() + # Notify channel + bot.sendMessage(chat_id=self.notify_chat, text=log_message) def logger(self, bot, update): @@ -206,13 +226,13 @@ class TelegramMonitorBot: update.message.text.encode('utf-8')) ) - if (self.debug or + if (True or update.message.from_user.id not in self.get_admin_ids(bot, update.message.chat_id)): # Security checks self.security_check_username(bot, update) self.security_check_message(bot, update) else: - print("Skipping checks. User is admin: {}".format(user.id)) + print("👮‍♂️ Skipping checks. User is admin: {}".format(user.id)) except Exception as e: print("Error: {}".format(e)) diff --git a/env_sample.sh b/env_sample.sh index 83917ed..3718794 100644 --- a/env_sample.sh +++ b/env_sample.sh @@ -1,6 +1,7 @@ # Example env vars for bot +# Copy this to `env.sh` and edit with your real vars -- it is ignored by git -export TELEGRAM_BOT_POSTGRES_URL="postgresql://postgres:postgres@localhost/origindb" +export TELEGRAM_BOT_POSTGRES_URL="postgresql://localhost/postgres" read -r -d '' MESSAGE_BAN_PATTERNS << 'EOF' # ETH @@ -25,3 +26,7 @@ export TELEGRAM_BOT_TOKEN="XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" export NAME_BAN_PATTERNS="admin$" export CHAT_IDS="-250531994" + +# Needed to make these env vars visible to python +export MESSAGE_BAN_PATTERNS=$MESSAGE_BAN_PATTERNS +export MESSAGE_HIDE_PATTERNS=$MESSAGE_HIDE_PATTERNS diff --git a/model.py b/model.py index 7bbed81..46f4909 100644 --- a/model.py +++ b/model.py @@ -3,6 +3,7 @@ from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base import os +# Localhost url: postgresql://localhost/postgres postgres_url = os.environ["TELEGRAM_BOT_POSTGRES_URL"]