flash / Database /sql /welcome_sql.py
Karma
Add files via upload
c7dfe8b
raw
history blame
12.1 kB
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 "<Chat {} should Welcome new users: {}>".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 "<Chat used clean service ({})>".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()