Compare commits

...

5 Commits

Author SHA1 Message Date
3fded13f18 WIP: sponsorship renewal 2023-04-08 01:18:05 +02:00
aa8e77811d Slightly improved context 2023-04-08 01:17:49 +02:00
0bffe9cf97 Just a space removed 2023-04-08 01:17:27 +02:00
177d456e79 Improved entities handling 2023-04-07 22:01:00 +02:00
7218d580bb Bump Pyrogram to 2.0.103 2023-04-07 21:54:09 +02:00
5 changed files with 200 additions and 21 deletions

View File

@@ -63,8 +63,12 @@ async def cmd_message(app: Client, msg: Message):
await msg.reply_text(
locale("message_enter", "message", locale=msg.from_user)
)
message = await listen_message(app, msg.chat.id, timeout=None)
if message.text is not None and message.text == "/cancel":
message = await listen_message(app, msg.chat.id)
if (
message is None
or message.text is not None
and message.text == "/cancel"
):
return
sent = await app.forward_messages(
configGet("admin", "groups"), msg.chat.id, message.id

View File

@@ -1,11 +1,31 @@
from datetime import datetime, timedelta
from typing import Union
from app import app
from pyrogram import filters
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, Message
from pyrogram.types import (
InlineKeyboardMarkup,
InlineKeyboardButton,
ReplyKeyboardMarkup,
ReplyKeyboardRemove,
ForceReply,
Message,
)
from pyrogram.client import Client
from classes.holo_user import HoloUser
from modules import custom_filters
from modules.utils import locale, should_quote
from modules.database import col_applications
from modules.database import col_sponsorships
from convopyro import listen_message
def is_none_or_cancel(message: Union[Message, None]) -> bool:
if (
message is None
or message.text is not None
and message.text.lower() == "/cancel"
):
return True
return False
@app.on_message(
@@ -26,21 +46,168 @@ async def cmd_sponsorship(app: Client, msg: Message):
if holo_user.spoiler_state() is True:
await msg.reply_text(locale("spoiler_in_progress", "message", locale=holo_user))
return
await msg.reply_text(
locale("sponsorship_apply", "message", locale=msg.from_user),
reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
text=str(
locale("sponsor_apply", "button", locale=msg.from_user)
),
callback_data=f"sponsor_apply_{msg.from_user.id}",
)
]
]
),
quote=should_quote(msg),
existent = col_sponsorships.find_one(
{
"user": msg.from_user.id,
"sponsorship.expires": {"$gt": datetime.now() - timedelta(days=1)},
}
)
if existent is None:
await msg.reply_text(
locale("sponsorship_apply", "message", locale=msg.from_user),
reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
text=str(
locale("sponsor_apply", "button", locale=msg.from_user)
),
callback_data=f"sponsor_apply_{msg.from_user.id}",
)
]
]
),
quote=should_quote(msg),
)
return
await msg.reply_text(
f'You have an active membership for **{existent["sponsorship"]["streamer"]}**. Wanna resubmit it once more?',
reply_markup=ReplyKeyboardMarkup(
[["Yep, use old data"], ["Nope, refill it once more"]],
resize_keyboard=True,
one_time_keyboard=True,
),
)
answer_decision = await listen_message(app, msg.chat.id)
if is_none_or_cancel(answer_decision):
return
input_streamer = existent["sponsorship"]["streamer"]
if answer_decision.text.lower() == "yep, use old data":
await answer_decision.reply_text(
"Okay, reusing the old data.\n\nUntil when is your sub?\n\nEnter the date as DD.MM.YYYY",
reply_markup=ForceReply(placeholder="Expiry date as DD.MM.YYYY"),
)
while True:
answer_date = await listen_message(app, msg.chat.id)
if is_none_or_cancel(answer_date):
return
try:
input_dt = datetime.strptime(answer_date.text, "%d.%m.%Y")
break
except ValueError:
await answer_date.reply_text(
"Invalid date! Provide as DD.MM.YYYY",
reply_markup=ForceReply(placeholder="Expiry date as DD.MM.YYYY"),
)
continue
while True:
await answer_date.reply_text(
"Alright. Now provide your proof **as a single screenshot**"
)
answer_proof = await listen_message(app, msg.chat.id)
if is_none_or_cancel(answer_proof):
return
if answer_proof.photo is None:
await answer_proof.reply_text(
"Please, provide proof **as a single screenshot**"
)
continue
input_proof = answer_proof.photo.file_id
break
await msg.reply_text(
f'Almost done. Do you want to keep the label **{existent["sponsorship"]["label"]}** or you want to change it?',
reply_markup=ReplyKeyboardMarkup(
[["Keep the old one"], ["Set a new one instead"]],
resize_keyboard=True,
one_time_keyboard=True,
),
)
while True:
answer_label_decision = await listen_message(app, msg.chat.id)
if is_none_or_cancel(answer_label_decision):
return
if answer_label_decision.text is None:
await answer_label_decision.reply_text(
"Please, choose a valid option.",
reply_markup=ReplyKeyboardMarkup(
[["Keep the old one"], ["Set a new one instead"]],
resize_keyboard=True,
one_time_keyboard=True,
),
)
continue
if answer_label_decision.text.lower() == "keep the old one":
input_label = existent["sponsorship"]["label"]
elif answer_label_decision.text.lower() == "set a new one instead":
await answer_label_decision.reply_text(
"Okay. Please provide a new label up to 16 characters long",
reply_markup=ForceReply(placeholder="New label"),
)
while True:
answer_label = await listen_message(app, msg.chat.id)
if is_none_or_cancel(answer_label_decision):
return
if answer_label.text is None:
await answer_label.reply_text(
"Please provide valid label",
reply_markup=ForceReply(placeholder="New label"),
)
continue
elif len(answer_label.text) > 16:
await answer_label.reply_text(
"Please provide a label not longer than 16 characters long",
reply_markup=ForceReply(placeholder="New label"),
)
continue
input_label = answer_label.text
break
await msg.reply_text(
f"So we did it for streamer **{input_streamer}**, til {input_dt.strftime('%d.%m.%Y')}, proofed by `{input_proof}` and labeled as **{input_label}**.",
reply_markup=ReplyKeyboardRemove(),
)
return
elif answer_decision.text.lower() == "nope, refill it once more":
await msg.reply_text(
locale("sponsorship_apply", "message", locale=msg.from_user),
reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
text=str(
locale("sponsor_apply", "button", locale=msg.from_user)
),
callback_data=f"sponsor_apply_{msg.from_user.id}",
)
]
]
),
quote=should_quote(msg),
)
return
else:
await answer_decision.reply_text(
"Invalid option!", reply_markup=ReplyKeyboardRemove()
)
return
# else:
# await msg.reply_text(locale("sponsorship_application_empty", "message"))

View File

@@ -66,8 +66,16 @@ async def msg_destination_group(app: Client, msg: Message):
for entity in entities:
if entity.type == MessageEntityType.TEXT_LINK:
analytics_entry["entities"]["links"].append(entity.url)
elif entity.type == MessageEntityType.URL:
analytics_entry["entities"]["links"].append(
text[entity.offset : entity.offset + entity.length]
)
elif entity.type == MessageEntityType.TEXT_MENTION:
analytics_entry["entities"]["mentions"].append(entity.user.id)
elif entity.type == MessageEntityType.MENTION:
analytics_entry["entities"]["mentions"].append(
text[entity.offset : entity.offset + entity.length]
)
lang = Detector(text, quiet=True).language

View File

@@ -173,7 +173,7 @@ if configGet("enabled", "features", "sponsorships") is True:
try:
tg_user = await app.get_users(entry["user"])
logWrite(
f"Notified user {entry['user']} that sponsorship expired"
f"Notified user {entry['user']} that sponsorship expired"
)
except Exception as exp:
logWrite(

View File

@@ -9,7 +9,7 @@ polyglot~=16.7.4
PyICU==2.10.2
pycld2==0.41
pymongo==4.3.3
Pyrogram~=2.0.102
Pyrogram~=2.0.103
python_dateutil==2.8.2
pykeyboard==0.1.5
requests==2.28.2