Compare commits
8 Commits
95e9fdf460
...
af862a3454
Author | SHA1 | Date | |
---|---|---|---|
|
af862a3454 | ||
|
1eb98750a7 | ||
|
eecb71a91e | ||
|
426b1550f6 | ||
|
0302d8c1ae | ||
|
5a6a96d3f9 | ||
|
12da1b2376 | ||
|
7db8c9ac5c |
@ -68,6 +68,11 @@ class UserInvalidError(Exception):
|
|||||||
self.user = user
|
self.user = user
|
||||||
super().__init__(f"Could not find HoloUser by using {type(self.user)} as an input type")
|
super().__init__(f"Could not find HoloUser by using {type(self.user)} as an input type")
|
||||||
|
|
||||||
|
class LabelTooLongError(Exception):
|
||||||
|
def __init__(self, label: str) -> None:
|
||||||
|
self.label = label
|
||||||
|
super().__init__(f"Could not set label to '{label}' because it is {len(label)} characters long (16 is maximum)")
|
||||||
|
|
||||||
class HoloUser():
|
class HoloUser():
|
||||||
"""This object represents a user of HoloChecker bot.
|
"""This object represents a user of HoloChecker bot.
|
||||||
It is primarily used to interact with a database in a more python-friendly way,
|
It is primarily used to interact with a database in a more python-friendly way,
|
||||||
@ -270,20 +275,22 @@ class HoloUser():
|
|||||||
logWrite(f"Could not notify admin about failure when sending message! Admin has never interacted with bot!")
|
logWrite(f"Could not notify admin about failure when sending message! Admin has never interacted with bot!")
|
||||||
await context.reply_text(locale("message_error", "message"), quote=should_quote(context))
|
await context.reply_text(locale("message_error", "message"), quote=should_quote(context))
|
||||||
|
|
||||||
async def set_label(self, chat: Chat, label: str) -> None:
|
async def label_set(self, chat: Chat, label: str) -> None:
|
||||||
"""Set label in destination group
|
"""Set label in destination group
|
||||||
|
|
||||||
### Args:
|
### Args:
|
||||||
* chat (`Chat`): Telegram chat
|
* chat (`Chat`): Telegram chat
|
||||||
* label (`str`): Label you want to set
|
* label (`str`): Label you want to set
|
||||||
"""
|
"""
|
||||||
|
if len(label) > 16:
|
||||||
|
raise LabelTooLongError(label)
|
||||||
self.label = label
|
self.label = label
|
||||||
self.set("label", label)
|
self.set("label", label)
|
||||||
await app.promote_chat_member(configGet("destination_group"), self.id)
|
await app.promote_chat_member(configGet("destination_group"), self.id, privileges=ChatPrivileges(can_pin_messages=True, can_manage_video_chats=True))
|
||||||
if not await isAnAdmin(self.id):
|
if not await isAnAdmin(self.id):
|
||||||
await app.set_administrator_title(configGet("destination_group"), self.id, label)
|
await app.set_administrator_title(configGet("destination_group"), self.id, label)
|
||||||
|
|
||||||
async def reset_label(self, chat: Chat) -> None:
|
async def label_reset(self, chat: Chat) -> None:
|
||||||
"""Reset label in destination group
|
"""Reset label in destination group
|
||||||
|
|
||||||
### Args:
|
### Args:
|
||||||
@ -294,7 +301,9 @@ class HoloUser():
|
|||||||
await app.set_administrator_title(configGet("destination_group"), self.id, "")
|
await app.set_administrator_title(configGet("destination_group"), self.id, "")
|
||||||
if not await isAnAdmin(self.id):
|
if not await isAnAdmin(self.id):
|
||||||
await app.promote_chat_member(configGet("destination_group"), self.id, privileges=ChatPrivileges(
|
await app.promote_chat_member(configGet("destination_group"), self.id, privileges=ChatPrivileges(
|
||||||
can_manage_chat=False
|
can_manage_chat=False,
|
||||||
|
can_pin_messages=False,
|
||||||
|
can_manage_video_chats=False
|
||||||
))
|
))
|
||||||
|
|
||||||
def application_state(self) -> tuple[Literal["none", "fill", "approved", "rejected"], bool]:
|
def application_state(self) -> tuple[Literal["none", "fill", "approved", "rejected"], bool]:
|
||||||
@ -498,9 +507,12 @@ class HoloUser():
|
|||||||
await msg.reply_text(locale(f"sponsor{stage+1}", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor{stage+1}", "force_reply", locale=self.locale))))
|
await msg.reply_text(locale(f"sponsor{stage+1}", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor{stage+1}", "force_reply", locale=self.locale))))
|
||||||
|
|
||||||
elif stage == 4:
|
elif stage == 4:
|
||||||
|
if len(query) > 16:
|
||||||
|
await msg.reply_text(locale("label_too_long", "message"))
|
||||||
|
return
|
||||||
progress["sponsorship"]["label"] = query
|
progress["sponsorship"]["label"] = query
|
||||||
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}}, {"$set": {"sponsorship": progress["sponsorship"], "complete": True}})
|
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}}, {"$set": {"sponsorship": progress["sponsorship"], "complete": True}})
|
||||||
await msg.reply_text("Sponsorship application is filled. Want to send it?", reply_markup=ReplyKeyboardMarkup(locale("confirm", "keyboard", locale=self.locale), resize_keyboard=True))
|
await msg.reply_text(locale("sponsor_confirm", "message"), reply_markup=ReplyKeyboardMarkup(locale("confirm", "keyboard", locale=self.locale), resize_keyboard=True))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
@ -12,6 +12,7 @@ makedirs(f'{configGet("cache", "locations")}{sep}avatars', exist_ok=True)
|
|||||||
# Importing
|
# Importing
|
||||||
from modules.commands.application import *
|
from modules.commands.application import *
|
||||||
from modules.commands.applications import *
|
from modules.commands.applications import *
|
||||||
|
from modules.commands.cancel import *
|
||||||
from modules.commands.label import *
|
from modules.commands.label import *
|
||||||
from modules.commands.message import *
|
from modules.commands.message import *
|
||||||
from modules.commands.nearby import *
|
from modules.commands.nearby import *
|
||||||
|
@ -20,7 +20,8 @@
|
|||||||
"question3_found": "Використовую наступний результат:\n• {0} ({1})",
|
"question3_found": "Використовую наступний результат:\n• {0} ({1})",
|
||||||
"question3_error": "⚠️ **Сталась помилка**\nНе вдалось отримати географічну мітку. Розробника повідомлено про цю помилку. Будь ласка, спробуйте ще раз.",
|
"question3_error": "⚠️ **Сталась помилка**\nНе вдалось отримати географічну мітку. Розробника повідомлено про цю помилку. Будь ласка, спробуйте ще раз.",
|
||||||
"question3_traceback": "⚠️ **Сталась помилка**\nПомилка отримання геокодингу для `{0}`\nПомилка: `{1}`\n\nTraceback:\n```\n{2}\n```",
|
"question3_traceback": "⚠️ **Сталась помилка**\nПомилка отримання геокодингу для `{0}`\nПомилка: `{1}`\n\nTraceback:\n```\n{2}\n```",
|
||||||
"sponsorship_apply": "ℹ️ Розпочато заповнення форми на отримання бонусів за платну підписку на холодівчат.",
|
"sponsorship_apply": "ℹ️ Оформіть платну підписку на когось з Холо, заповніть форму та отримайте особливу роль в якості винагороди!",
|
||||||
|
"sponsorship_applying": "ℹ️ Розпочато заповнення форми на отримання бонусів за платну підписку на холодівчат.",
|
||||||
"sponsor1": "На яку саме дівчину платна підписка?",
|
"sponsor1": "На яку саме дівчину платна підписка?",
|
||||||
"sponsor2": "До якої дати (`ДД.ММ.РРРР`) підписка?",
|
"sponsor2": "До якої дати (`ДД.ММ.РРРР`) підписка?",
|
||||||
"sponsor2_invalid": "Будь ласка, введи дату формату `ДД.ММ.РРРР`",
|
"sponsor2_invalid": "Будь ласка, введи дату формату `ДД.ММ.РРРР`",
|
||||||
@ -29,6 +30,7 @@
|
|||||||
"sponsor4": "Яку роль ти бажаєш отримати?",
|
"sponsor4": "Яку роль ти бажаєш отримати?",
|
||||||
"sponsorship_application_empty": "❌ **Дія неможлива**\nУ тебе немає заповненої та схваленої анкети. Заповни таку за допомогою /reapply та спробуй ще раз після її підтвердження.",
|
"sponsorship_application_empty": "❌ **Дія неможлива**\nУ тебе немає заповненої та схваленої анкети. Заповни таку за допомогою /reapply та спробуй ще раз після її підтвердження.",
|
||||||
"confirm": "Супер, дякуємо!\n\nБудь ласка, перевір правильність даних:\n{0}\n\nВсе правильно?",
|
"confirm": "Супер, дякуємо!\n\nБудь ласка, перевір правильність даних:\n{0}\n\nВсе правильно?",
|
||||||
|
"sponsor_confirm": "Здається, це все. Перевір чи все правильно та жмакни кнопку на клавіатурі щоб продовжити.",
|
||||||
"application_sent": "Дякуємо! Ми надіслали твою анкетку на перевірку. Ти отримаєш повідомлення як тільки її перевірять та приймуть рішення. До тих пір від тебе більше нічого не потребується. Гарного дня! :)",
|
"application_sent": "Дякуємо! Ми надіслали твою анкетку на перевірку. Ти отримаєш повідомлення як тільки її перевірять та приймуть рішення. До тих пір від тебе більше нічого не потребується. Гарного дня! :)",
|
||||||
"sponsorship_sent": "Дякуємо! Ми надіслали форму на перевірку. Ти отримаєш повідомлення як тільки її перевірять та приймуть рішення. Гарного дня! :)",
|
"sponsorship_sent": "Дякуємо! Ми надіслали форму на перевірку. Ти отримаєш повідомлення як тільки її перевірять та приймуть рішення. Гарного дня! :)",
|
||||||
"application_got": "Отримано анкету від `{0}`\n\nІм'я тг: `{1}`\nЮзернейм: @{2}\n\n**Дані анкети:**\n{3}",
|
"application_got": "Отримано анкету від `{0}`\n\nІм'я тг: `{1}`\nЮзернейм: @{2}\n\n**Дані анкети:**\n{3}",
|
||||||
@ -87,6 +89,7 @@
|
|||||||
"joined_false_link": "Користувач **{0}** (`{1}`) приєднався до групи не за своїм посиланням",
|
"joined_false_link": "Користувач **{0}** (`{1}`) приєднався до групи не за своїм посиланням",
|
||||||
"sponsorships_expires": "⚠️ **Нагадування**\nНадана платна підписка припинить діяти **за {0} д**. Будь ласка, оновіть дані про неї командою /sponsorship інакше роль буде втрачено!",
|
"sponsorships_expires": "⚠️ **Нагадування**\nНадана платна підписка припинить діяти **за {0} д**. Будь ласка, оновіть дані про неї командою /sponsorship інакше роль буде втрачено!",
|
||||||
"sponsorships_expired": "⚠️ **Нагадування**\nТермін дії вказаної підписки сплив. Для повторного отримання ролі користуйся командою /sponsorship.",
|
"sponsorships_expired": "⚠️ **Нагадування**\nТермін дії вказаної підписки сплив. Для повторного отримання ролі користуйся командою /sponsorship.",
|
||||||
|
"label_too_long": "Довжина назви ролі не повинна перевищувати 16 символів",
|
||||||
"voice_message": [
|
"voice_message": [
|
||||||
"why are u gae",
|
"why are u gae",
|
||||||
"руки відірвало? пиши як людина",
|
"руки відірвало? пиши як людина",
|
||||||
@ -188,7 +191,9 @@
|
|||||||
"rules_home": "ℹ️ Показано головну правил",
|
"rules_home": "ℹ️ Показано головну правил",
|
||||||
"rules_additional": "ℹ️ Показано додаткові правила",
|
"rules_additional": "ℹ️ Показано додаткові правила",
|
||||||
"reapply_stopped": "ℹ️ Перервано заповнення анкети",
|
"reapply_stopped": "ℹ️ Перервано заповнення анкети",
|
||||||
"sponsor_started": "ℹ️ Заповнення форми розпочато"
|
"sponsor_started": "ℹ️ Заповнення форми розпочато",
|
||||||
|
"sponsor_accepted": "✅ Форму {0} схвалено",
|
||||||
|
"sponsor_rejected": "❌ Форму {0} відхилено"
|
||||||
},
|
},
|
||||||
"inline": {
|
"inline": {
|
||||||
"forbidden": {
|
"forbidden": {
|
||||||
|
@ -19,7 +19,7 @@ async def callback_query_sponsor_apply(app, clb):
|
|||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("sponsor_started", "button")), callback_data="nothing")]]
|
edited_markup = [[InlineKeyboardButton(text=str(locale("sponsor_started", "button")), callback_data="nothing")]]
|
||||||
|
|
||||||
await clb.message.edit(text=locale("sponsorship_apply", "message"), reply_markup=InlineKeyboardMarkup(edited_markup))
|
await clb.message.edit(text=locale("sponsorship_applying", "message"), reply_markup=InlineKeyboardMarkup(edited_markup))
|
||||||
await app.send_message(holo_user.id, locale(f"sponsor1", "message", locale=holo_user.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor1", "force_reply", locale=holo_user.locale))))
|
await app.send_message(holo_user.id, locale(f"sponsor1", "message", locale=holo_user.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor1", "force_reply", locale=holo_user.locale))))
|
||||||
await clb.answer(text=locale("sponsor_started", "callback").format(holo_user.id), show_alert=False)
|
await clb.answer(text=locale("sponsor_started", "callback").format(holo_user.id), show_alert=False)
|
||||||
|
|
||||||
@ -34,18 +34,18 @@ async def callback_query_sponsor_yes(app, clb):
|
|||||||
logWrite(f"User {holo_user.id} got approved by {clb.from_user.id}")
|
logWrite(f"User {holo_user.id} got approved by {clb.from_user.id}")
|
||||||
|
|
||||||
if col_sponsorships.find_one({"user": holo_user.id}) is not None:
|
if col_sponsorships.find_one({"user": holo_user.id}) is not None:
|
||||||
col_sponsorships.update_one({"date": {"$eq": datetime.now()}, "admin": {"$eq": clb.from_user.id}, "sponsorship": {"$eq": col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}})["sponsorship"]}})
|
col_sponsorships.update_one({"user": holo_user.id}, {"date": {"$eq": datetime.now()}, "admin": {"$eq": clb.from_user.id}, "sponsorship": {"$eq": col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}})["sponsorship"]}})
|
||||||
else:
|
else:
|
||||||
col_sponsorships.insert_one({"user": holo_user.id, "date": datetime.now(), "admin": clb.from_user.id, "sponsorship": col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}})["sponsorship"]})
|
col_sponsorships.insert_one({"user": holo_user.id, "date": datetime.now(), "admin": clb.from_user.id, "sponsorship": col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}})["sponsorship"]})
|
||||||
|
|
||||||
col_tmp.update_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}}, {"$set": {"state": "approved", "sent": False}})
|
col_tmp.update_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}}, {"$set": {"state": "approved", "sent": False}})
|
||||||
|
|
||||||
await holo_user.set_label(configGet("destination_group"), col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}})["sponsorship"]["label"])
|
await holo_user.label_set(configGet("destination_group"), col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}})["sponsorship"]["label"])
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("accepted", "button")), callback_data="nothing")]]
|
edited_markup = [[InlineKeyboardButton(text=str(locale("accepted", "button")), callback_data="nothing")]]
|
||||||
|
|
||||||
await app.edit_message_caption(clb.message.chat.id, clb.message.id, caption=clb.message.caption, reply_markup=InlineKeyboardMarkup(edited_markup))
|
await app.edit_message_caption(clb.message.chat.id, clb.message.id, caption=clb.message.caption, reply_markup=InlineKeyboardMarkup(edited_markup))
|
||||||
await clb.answer(text=f"✅ Confirmed {fullclb[2]}", show_alert=False)
|
await clb.answer(text=locale("sponsor_accepted", "callback").format(fullclb[2]), show_alert=False)
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("sponsor_no_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sponsor_no_[\s\S]*"))
|
||||||
async def callback_query_sponsor_no(app, clb):
|
async def callback_query_sponsor_no(app, clb):
|
||||||
@ -62,4 +62,4 @@ async def callback_query_sponsor_no(app, clb):
|
|||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("declined", "button")), callback_data="nothing")]]
|
edited_markup = [[InlineKeyboardButton(text=str(locale("declined", "button")), callback_data="nothing")]]
|
||||||
|
|
||||||
await app.edit_message_caption(clb.message.chat.id, clb.message.id, caption=clb.message.caption, reply_markup=InlineKeyboardMarkup(edited_markup))
|
await app.edit_message_caption(clb.message.chat.id, clb.message.id, caption=clb.message.caption, reply_markup=InlineKeyboardMarkup(edited_markup))
|
||||||
await clb.answer(text=f"❌ Rejected {fullclb[2]}", show_alert=False)
|
await clb.answer(text=locale("sponsor_rejected", "callback").format(fullclb[2]), show_alert=False)
|
7
modules/commands/cancel.py
Normal file
7
modules/commands/cancel.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from app import app
|
||||||
|
from pyrogram import filters
|
||||||
|
from modules.utils import should_quote
|
||||||
|
|
||||||
|
@app.on_message(~ filters.scheduled & filters.command("cancel", prefixes=["/"]))
|
||||||
|
async def command_cancel(app, msg):
|
||||||
|
await msg.reply_text("Command exists.", quote=should_quote(msg))
|
@ -1,7 +1,7 @@
|
|||||||
from app import app, isAnAdmin
|
from app import app, isAnAdmin
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from modules.utils import should_quote, find_user
|
from modules.utils import locale, should_quote, find_user
|
||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser, LabelTooLongError
|
||||||
|
|
||||||
@app.on_message(~ filters.scheduled & filters.private & filters.command(["label"], prefixes=["/"]))
|
@app.on_message(~ filters.scheduled & filters.private & filters.command(["label"], prefixes=["/"]))
|
||||||
async def cmd_label(app, msg):
|
async def cmd_label(app, msg):
|
||||||
@ -21,11 +21,15 @@ async def cmd_label(app, msg):
|
|||||||
label = " ".join(msg.command[2:])
|
label = " ".join(msg.command[2:])
|
||||||
|
|
||||||
if label.lower() == "reset":
|
if label.lower() == "reset":
|
||||||
await target.reset_label(msg.chat)
|
await target.label_reset(msg.chat)
|
||||||
await msg.reply_text(f"Resetting **{target.id}**'s label...", quote=should_quote(msg))
|
await msg.reply_text(f"Resetting **{target.id}**'s label...", quote=should_quote(msg))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
await target.set_label(msg.chat, label)
|
try:
|
||||||
|
await target.label_set(msg.chat, label)
|
||||||
|
except LabelTooLongError:
|
||||||
|
await msg.reply_text(locale("label_too_long", "message"))
|
||||||
|
return
|
||||||
await msg.reply_text(f"Setting **{target.id}**'s label to **{label}**...", quote=should_quote(msg))
|
await msg.reply_text(f"Setting **{target.id}**'s label to **{label}**...", quote=should_quote(msg))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
from datetime import datetime
|
|
||||||
from app import app, isAnAdmin
|
from app import app, isAnAdmin
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton
|
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton
|
||||||
@ -12,17 +11,4 @@ async def cmd_sponsorship(app, msg):
|
|||||||
await msg.reply_text(locale("sponsorship_apply", "message"), reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text=str(locale("sponsor_apply", "button")), callback_data=f"sponsor_apply_{msg.from_user.id}")]]), quote=should_quote(msg))
|
await msg.reply_text(locale("sponsorship_apply", "message"), reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text=str(locale("sponsor_apply", "button")), callback_data=f"sponsor_apply_{msg.from_user.id}")]]), quote=should_quote(msg))
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("sponsorship_application_empty", "message"))
|
await msg.reply_text(locale("sponsorship_application_empty", "message"))
|
||||||
# if not path.exists(f"{configGet('data', 'locations')}{sep}sponsors{sep}{msg.from_user.id}.json"):
|
|
||||||
# jsonSave(jsonLoad(f"{configGet('data', 'locations')}{sep}sponsor_default.json"), f"{configGet('data', 'locations')}{sep}sponsors{sep}{msg.from_user.id}.json")
|
|
||||||
# sponsor = jsonLoad(f"{configGet('data', 'locations')}{sep}sponsors{sep}{msg.from_user.id}.json")
|
|
||||||
# if sponsor["approved"]:
|
|
||||||
# if sponsor["expires"] is not None:
|
|
||||||
# if datetime.strptime(sponsor["expires"], "%d.%m.%Y") > datetime.now():
|
|
||||||
# await msg.reply_text(f"You have an active sub til **{sponsor['expires']}**.")
|
|
||||||
# else:
|
|
||||||
# await msg.reply_text(f"Your sub expired {int((datetime.now()-datetime.strptime(sponsor['expires'], '%d.%m.%Y')).days)} days ago.")
|
|
||||||
# elif sponsor["approved"]:
|
|
||||||
# await msg.reply_text(f"Your sub expiration date is not valid.")
|
|
||||||
# else:
|
|
||||||
# await msg.reply_text(f"You have no active subscription.")
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -61,10 +61,11 @@ if configGet("enabled", "scheduler", "sponsorships"):
|
|||||||
try:
|
try:
|
||||||
holo_user = HoloUser(entry["user"])
|
holo_user = HoloUser(entry["user"])
|
||||||
await app.send_message( entry["user"], locale("sponsorships_expired", "message") ) # type: ignore
|
await app.send_message( entry["user"], locale("sponsorships_expired", "message") ) # type: ignore
|
||||||
await holo_user.reset_label(configGet("destination_group"))
|
await holo_user.label_reset(configGet("destination_group"))
|
||||||
|
col_sponsorships.find_one_and_delete({"user": holo_user.id})
|
||||||
try:
|
try:
|
||||||
tg_user = await app.get_users(entry["user"])
|
tg_user = await app.get_users(entry["user"])
|
||||||
logWrite(f"Notified user that sponsorship expires in {until_expiry} days")
|
logWrite(f"Notified user that sponsorship expired")
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not find user {entry['user']} notify about sponsorship expired due to '{exp}'")
|
logWrite(f"Could not find user {entry['user']} notify about sponsorship expired due to '{exp}'")
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
|
Reference in New Issue
Block a user