import random import threading from typing import Union from sqlalchemy import BigInteger, Boolean, Column, Integer, String, UnicodeText from Database.sql import BASE, SESSION from Mikobot.plugins.helper_funcs.msg_types import Types DEFAULT_WELCOME = "Hey {first}, how are you?" DEFAULT_GOODBYE = "Nice knowing you!" DEFAULT_WELCOME_MESSAGES = [ "{first} is here!", # Discord welcome messages copied "Ready player {first}", "Welcome bro {first}", ] DEFAULT_GOODBYE_MESSAGES = [ "{first} will be missed.", "{first} when back ?", ] # Line 111 to 152 are references from https://bindingofisaac.fandom.com/wiki/Fortune_Telling_Machine class Welcome(BASE): __tablename__ = "welcome_pref" chat_id = Column(String(14), primary_key=True) should_welcome = Column(Boolean, default=True) should_goodbye = Column(Boolean, default=True) custom_content = Column(UnicodeText, default=None) custom_welcome = Column( UnicodeText, default=random.choice(DEFAULT_WELCOME_MESSAGES), ) welcome_type = Column(Integer, default=Types.TEXT.value) custom_leave = Column(UnicodeText, default=random.choice(DEFAULT_GOODBYE_MESSAGES)) leave_type = Column(Integer, default=Types.TEXT.value) clean_welcome = Column(BigInteger) def __init__(self, chat_id, should_welcome=True, should_goodbye=True): self.chat_id = chat_id self.should_welcome = should_welcome self.should_goodbye = should_goodbye def __repr__(self): return "".format( self.chat_id, self.should_welcome, ) class WelcomeButtons(BASE): __tablename__ = "welcome_urls" id = Column(Integer, primary_key=True, autoincrement=True) chat_id = Column(String(14), primary_key=True) name = Column(UnicodeText, nullable=False) url = Column(UnicodeText, nullable=False) same_line = Column(Boolean, default=False) def __init__(self, chat_id, name, url, same_line=False): self.chat_id = str(chat_id) self.name = name self.url = url self.same_line = same_line class GoodbyeButtons(BASE): __tablename__ = "leave_urls" id = Column(Integer, primary_key=True, autoincrement=True) chat_id = Column(String(14), primary_key=True) name = Column(UnicodeText, nullable=False) url = Column(UnicodeText, nullable=False) same_line = Column(Boolean, default=False) def __init__(self, chat_id, name, url, same_line=False): self.chat_id = str(chat_id) self.name = name self.url = url self.same_line = same_line class WelcomeMute(BASE): __tablename__ = "welcome_mutes" chat_id = Column(String(14), primary_key=True) welcomemutes = Column(UnicodeText, default=False) def __init__(self, chat_id, welcomemutes): self.chat_id = str(chat_id) # ensure string self.welcomemutes = welcomemutes class WelcomeMuteUsers(BASE): __tablename__ = "human_checks" user_id = Column(BigInteger, primary_key=True) chat_id = Column(String(14), primary_key=True) human_check = Column(Boolean) def __init__(self, user_id, chat_id, human_check): self.user_id = user_id # ensure string self.chat_id = str(chat_id) self.human_check = human_check class CleanServiceSetting(BASE): __tablename__ = "clean_service" chat_id = Column(String(14), primary_key=True) clean_service = Column(Boolean, default=True) def __init__(self, chat_id): self.chat_id = str(chat_id) def __repr__(self): return "".format(self.chat_id) Welcome.__table__.create(checkfirst=True) WelcomeButtons.__table__.create(checkfirst=True) GoodbyeButtons.__table__.create(checkfirst=True) WelcomeMute.__table__.create(checkfirst=True) WelcomeMuteUsers.__table__.create(checkfirst=True) CleanServiceSetting.__table__.create(checkfirst=True) INSERTION_LOCK = threading.RLock() WELC_BTN_LOCK = threading.RLock() LEAVE_BTN_LOCK = threading.RLock() WM_LOCK = threading.RLock() CS_LOCK = threading.RLock() def welcome_mutes(chat_id): try: welcomemutes = SESSION.query(WelcomeMute).get(str(chat_id)) if welcomemutes: return welcomemutes.welcomemutes return False finally: SESSION.close() def set_welcome_mutes(chat_id, welcomemutes): with WM_LOCK: prev = SESSION.query(WelcomeMute).get((str(chat_id))) if prev: SESSION.delete(prev) welcome_m = WelcomeMute(str(chat_id), welcomemutes) SESSION.add(welcome_m) SESSION.commit() def set_human_checks(user_id, chat_id): with INSERTION_LOCK: human_check = SESSION.query(WelcomeMuteUsers).get((user_id, str(chat_id))) if not human_check: human_check = WelcomeMuteUsers(user_id, str(chat_id), True) else: human_check.human_check = True SESSION.add(human_check) SESSION.commit() return human_check def get_human_checks(user_id, chat_id): try: human_check = SESSION.query(WelcomeMuteUsers).get((user_id, str(chat_id))) if not human_check: return None human_check = human_check.human_check return human_check finally: SESSION.close() def get_welc_mutes_pref(chat_id): welcomemutes = SESSION.query(WelcomeMute).get(str(chat_id)) SESSION.close() if welcomemutes: return welcomemutes.welcomemutes return False def get_welc_pref(chat_id): welc = SESSION.query(Welcome).get(str(chat_id)) SESSION.close() if welc: return ( welc.should_welcome, welc.custom_welcome, welc.custom_content, welc.welcome_type, ) else: # Welcome by default. return True, DEFAULT_WELCOME, None, Types.TEXT def get_gdbye_pref(chat_id): welc = SESSION.query(Welcome).get(str(chat_id)) SESSION.close() if welc: return welc.should_goodbye, welc.custom_leave, welc.leave_type else: # Welcome by default. return True, DEFAULT_GOODBYE, Types.TEXT def set_clean_welcome(chat_id, clean_welcome): with INSERTION_LOCK: curr = SESSION.query(Welcome).get(str(chat_id)) if not curr: curr = Welcome(str(chat_id)) curr.clean_welcome = int(clean_welcome) SESSION.add(curr) SESSION.commit() def get_clean_pref(chat_id): welc = SESSION.query(Welcome).get(str(chat_id)) SESSION.close() if welc: return welc.clean_welcome return False def set_welc_preference(chat_id, should_welcome): with INSERTION_LOCK: curr = SESSION.query(Welcome).get(str(chat_id)) if not curr: curr = Welcome(str(chat_id), should_welcome=should_welcome) else: curr.should_welcome = should_welcome SESSION.add(curr) SESSION.commit() def set_gdbye_preference(chat_id, should_goodbye): with INSERTION_LOCK: curr = SESSION.query(Welcome).get(str(chat_id)) if not curr: curr = Welcome(str(chat_id), should_goodbye=should_goodbye) else: curr.should_goodbye = should_goodbye SESSION.add(curr) SESSION.commit() def set_custom_welcome( chat_id, custom_content, custom_welcome, welcome_type, buttons=None, ): if buttons is None: buttons = [] with INSERTION_LOCK: welcome_settings = SESSION.query(Welcome).get(str(chat_id)) if not welcome_settings: welcome_settings = Welcome(str(chat_id), True) if custom_welcome or custom_content: welcome_settings.custom_content = custom_content welcome_settings.custom_welcome = custom_welcome welcome_settings.welcome_type = welcome_type.value else: welcome_settings.custom_welcome = DEFAULT_WELCOME welcome_settings.welcome_type = Types.TEXT.value SESSION.add(welcome_settings) with WELC_BTN_LOCK: prev_buttons = ( SESSION.query(WelcomeButtons) .filter(WelcomeButtons.chat_id == str(chat_id)) .all() ) for btn in prev_buttons: SESSION.delete(btn) for b_name, url, same_line in buttons: button = WelcomeButtons(chat_id, b_name, url, same_line) SESSION.add(button) SESSION.commit() def get_custom_welcome(chat_id): welcome_settings = SESSION.query(Welcome).get(str(chat_id)) ret = DEFAULT_WELCOME if welcome_settings and welcome_settings.custom_welcome: ret = welcome_settings.custom_welcome SESSION.close() return ret def set_custom_gdbye(chat_id, custom_goodbye, goodbye_type, buttons=None): if buttons is None: buttons = [] with INSERTION_LOCK: welcome_settings = SESSION.query(Welcome).get(str(chat_id)) if not welcome_settings: welcome_settings = Welcome(str(chat_id), True) if custom_goodbye: welcome_settings.custom_leave = custom_goodbye welcome_settings.leave_type = goodbye_type.value else: welcome_settings.custom_leave = DEFAULT_GOODBYE welcome_settings.leave_type = Types.TEXT.value SESSION.add(welcome_settings) with LEAVE_BTN_LOCK: prev_buttons = ( SESSION.query(GoodbyeButtons) .filter(GoodbyeButtons.chat_id == str(chat_id)) .all() ) for btn in prev_buttons: SESSION.delete(btn) for b_name, url, same_line in buttons: button = GoodbyeButtons(chat_id, b_name, url, same_line) SESSION.add(button) SESSION.commit() def get_custom_gdbye(chat_id): welcome_settings = SESSION.query(Welcome).get(str(chat_id)) ret = DEFAULT_GOODBYE if welcome_settings and welcome_settings.custom_leave: ret = welcome_settings.custom_leave SESSION.close() return ret def get_welc_buttons(chat_id): try: return ( SESSION.query(WelcomeButtons) .filter(WelcomeButtons.chat_id == str(chat_id)) .order_by(WelcomeButtons.id) .all() ) finally: SESSION.close() def get_gdbye_buttons(chat_id): try: return ( SESSION.query(GoodbyeButtons) .filter(GoodbyeButtons.chat_id == str(chat_id)) .order_by(GoodbyeButtons.id) .all() ) finally: SESSION.close() def clean_service(chat_id: Union[str, int]) -> bool: try: chat_setting = SESSION.query(CleanServiceSetting).get(str(chat_id)) if chat_setting: return chat_setting.clean_service return False finally: SESSION.close() def set_clean_service(chat_id: Union[int, str], setting: bool): with CS_LOCK: chat_setting = SESSION.query(CleanServiceSetting).get(str(chat_id)) if not chat_setting: chat_setting = CleanServiceSetting(chat_id) chat_setting.clean_service = setting SESSION.add(chat_setting) SESSION.commit() def migrate_chat(old_chat_id, new_chat_id): with INSERTION_LOCK: chat = SESSION.query(Welcome).get(str(old_chat_id)) if chat: chat.chat_id = str(new_chat_id) with WELC_BTN_LOCK: chat_buttons = ( SESSION.query(WelcomeButtons) .filter(WelcomeButtons.chat_id == str(old_chat_id)) .all() ) for btn in chat_buttons: btn.chat_id = str(new_chat_id) with LEAVE_BTN_LOCK: chat_buttons = ( SESSION.query(GoodbyeButtons) .filter(GoodbyeButtons.chat_id == str(old_chat_id)) .all() ) for btn in chat_buttons: btn.chat_id = str(new_chat_id) SESSION.commit()