Almost working, some problems still with defining todays product
This commit is contained in:
parent
5989d1d39b
commit
04862a0a1a
104
source/bot.py
104
source/bot.py
@ -42,13 +42,13 @@ def send_start(message):
|
|||||||
|
|
||||||
Args:
|
Args:
|
||||||
message (Message): message from telegram user, here /start
|
message (Message): message from telegram user, here /start
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Test:
|
Test:
|
||||||
type /start as command in telegram as an unregistered user and check if bot responds with start message and waits for name
|
type /start as command in telegram as an unregistered user and check if bot responds with start message and waits for name
|
||||||
type /start as command in telegram as a registered user and check if bot responds with informing user about being already registered
|
type /start as command in telegram as a registered user and check if bot responds with informing user about being already registered
|
||||||
@ -57,7 +57,7 @@ def send_start(message):
|
|||||||
if message.from_user.id in session.query(User.telegram_id).all():
|
if message.from_user.id in session.query(User.telegram_id).all():
|
||||||
bot.reply_to(message, "You are already registered. Type /changename to change your name or /help for an overview of all commands")
|
bot.reply_to(message, "You are already registered. Type /changename to change your name or /help for an overview of all commands")
|
||||||
return
|
return
|
||||||
|
|
||||||
bot.send_message(chat_id=int(message.from_user.id), text=("Welcome to the game... \
|
bot.send_message(chat_id=int(message.from_user.id), text=("Welcome to the game... \
|
||||||
\nTo start please set a name for yourself or type cancel to set generated name:"))
|
\nTo start please set a name for yourself or type cancel to set generated name:"))
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ def start_name_setter(message):
|
|||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Test:
|
Test:
|
||||||
check Regex pattern with incorrect patterns and test if these patterns are denied
|
check Regex pattern with incorrect patterns and test if these patterns are denied
|
||||||
check Regex pattern with correct patterns and test if these patterns are accepted
|
check Regex pattern with correct patterns and test if these patterns are accepted
|
||||||
@ -90,7 +90,7 @@ def start_name_setter(message):
|
|||||||
if not re.match(r'^[a-zA-Z][a-zA-Z0-9\-]+$', str(message.text)): # regex pattern for username: has to start with a letter, can contain letters, numbers and hyphen
|
if not re.match(r'^[a-zA-Z][a-zA-Z0-9\-]+$', str(message.text)): # regex pattern for username: has to start with a letter, can contain letters, numbers and hyphen
|
||||||
bot.reply_to(message, "Name has to be alphanumeric (including -) and start with a letter")
|
bot.reply_to(message, "Name has to be alphanumeric (including -) and start with a letter")
|
||||||
return
|
return
|
||||||
|
|
||||||
user_name = str(message.text)
|
user_name = str(message.text)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -131,8 +131,7 @@ def send_help(message):
|
|||||||
"/gameinfo get game info\n"
|
"/gameinfo get game info\n"
|
||||||
"/scoreboard get scoreboard\n"
|
"/scoreboard get scoreboard\n"
|
||||||
"/changename change your name\n"
|
"/changename change your name\n"
|
||||||
"/challenge get todays challenge\n"
|
"/daily get todays challenge\n"
|
||||||
"/daily open and do challenge for today\n"
|
|
||||||
"/setAdmin set admin status of user (ADMIN)\n"
|
"/setAdmin set admin status of user (ADMIN)\n"
|
||||||
"/addproduct add product for further challenges (ADMIN)\n"
|
"/addproduct add product for further challenges (ADMIN)\n"
|
||||||
"/users get all users (ADMIN)\n")
|
"/users get all users (ADMIN)\n")
|
||||||
@ -151,9 +150,9 @@ def send_gameinfo(message):
|
|||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Test:
|
Test:
|
||||||
type /gameinfo or /Gameinfo as command in telegramand check if bot responds with game info message
|
type /gameinfo or /Gameinfo as command in telegram and check if bot responds with game info message
|
||||||
type /gameInfo as command in telegramand check if bot responds with unknown command message
|
type /gameInfo as command in telegramand check if bot responds with unknown command message
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -162,7 +161,7 @@ def send_gameinfo(message):
|
|||||||
"Start by setting your name with /changename\n"
|
"Start by setting your name with /changename\n"
|
||||||
"You can get a new challenge every day.\n"
|
"You can get a new challenge every day.\n"
|
||||||
"You are informed when a new challenge is available.\n"
|
"You are informed when a new challenge is available.\n"
|
||||||
"To see the challenge type /challenge\n"
|
"To see the challenge type /daily\n"
|
||||||
"To guess the price type /guess\n"
|
"To guess the price type /guess\n"
|
||||||
"At 22:00 pm the scores and answer will be shown\n")
|
"At 22:00 pm the scores and answer will be shown\n")
|
||||||
bot.reply_to(message, gameinfo_message)
|
bot.reply_to(message, gameinfo_message)
|
||||||
@ -180,7 +179,7 @@ def send_user_info(message):
|
|||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Test:
|
Test:
|
||||||
type /me as command in telegram as an registered User and check if bot responds with user info message
|
type /me as command in telegram as an registered User and check if bot responds with user info message
|
||||||
type /me as command in telegram as an unregistered User and check if bot responds with User does not exist message
|
type /me as command in telegram as an unregistered User and check if bot responds with User does not exist message
|
||||||
@ -223,7 +222,7 @@ def send_users(message):
|
|||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Test:
|
Test:
|
||||||
type /users as command in telegram as an registered Admin and check if bot responds with user info messages
|
type /users as command in telegram as an registered Admin and check if bot responds with user info messages
|
||||||
type /users as command in telegram as an an registered User where Admin = False and check if bot responds with "Admin rights are required to see all users" message
|
type /users as command in telegram as an an registered User where Admin = False and check if bot responds with "Admin rights are required to see all users" message
|
||||||
@ -268,7 +267,7 @@ def set_admin(message):
|
|||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Test:
|
Test:
|
||||||
type /setAdmin as command in telegram as an registered Admin and check if bot requests id and boolean for changing admin status
|
type /setAdmin as command in telegram as an registered Admin and check if bot requests id and boolean for changing admin status
|
||||||
type /setAdmin as command in telegram as an an registered User where Admin = False in db and check if bot responds with "Admin rights are required to change admin status" message
|
type /setAdmin as command in telegram as an an registered User where Admin = False in db and check if bot responds with "Admin rights are required to change admin status" message
|
||||||
@ -278,6 +277,7 @@ def set_admin(message):
|
|||||||
user_id = message.from_user.id
|
user_id = message.from_user.id
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
user = session.query(User).filter(User.telegram_id==user_id).first()
|
user = session.query(User).filter(User.telegram_id==user_id).first()
|
||||||
|
|
||||||
if not user.admin: # admin is a boolean
|
if not user.admin: # admin is a boolean
|
||||||
@ -288,6 +288,7 @@ def set_admin(message):
|
|||||||
bot.reply_to(message, "Type the telegram_id and boolean of admin attribute like <telegram_id> <value>")
|
bot.reply_to(message, "Type the telegram_id and boolean of admin attribute like <telegram_id> <value>")
|
||||||
bot.register_next_step_handler(message, set_admin_handler)
|
bot.register_next_step_handler(message, set_admin_handler)
|
||||||
|
|
||||||
|
|
||||||
except sqlalchemy.exc.IntegrityError:
|
except sqlalchemy.exc.IntegrityError:
|
||||||
session.rollback()
|
session.rollback()
|
||||||
bot.reply_to(message, "Something went wrong.")
|
bot.reply_to(message, "Something went wrong.")
|
||||||
@ -304,7 +305,7 @@ def set_admin_handler(message):
|
|||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Test:
|
Test:
|
||||||
type in correct regex pattern and check if bot sets admin status of user correctly
|
type in correct regex pattern and check if bot sets admin status of user correctly
|
||||||
type in wrong regex pattern and check if bot responds with Invalid format message
|
type in wrong regex pattern and check if bot responds with Invalid format message
|
||||||
@ -349,7 +350,7 @@ def send_scoreboard(message):
|
|||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Test:
|
Test:
|
||||||
type /scoreboard as command in telegram and check if bot responds with scoreboard with correct info and formatting
|
type /scoreboard as command in telegram and check if bot responds with scoreboard with correct info and formatting
|
||||||
test with db with no Users and check if bot responds with "No users registered" message
|
test with db with no Users and check if bot responds with "No users registered" message
|
||||||
@ -369,7 +370,7 @@ def send_scoreboard(message):
|
|||||||
for user in users:
|
for user in users:
|
||||||
telegram_id = user.telegram_id
|
telegram_id = user.telegram_id
|
||||||
user_scores = session.query(Score).filter(Score.telegram_id==telegram_id).all() # get all scores of user
|
user_scores = session.query(Score).filter(Score.telegram_id==telegram_id).all() # get all scores of user
|
||||||
|
|
||||||
if user_scores is None:
|
if user_scores is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -388,7 +389,7 @@ def send_scoreboard(message):
|
|||||||
|
|
||||||
if user_scores is None:
|
if user_scores is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
weekly_score = sum(score.score for score in user_scores)
|
weekly_score = sum(score.score for score in user_scores)
|
||||||
weekly_board.append((user.username, weekly_score))
|
weekly_board.append((user.username, weekly_score))
|
||||||
|
|
||||||
@ -413,31 +414,11 @@ def send_scoreboard(message):
|
|||||||
|
|
||||||
if len(weekly_board) == 0:
|
if len(weekly_board) == 0:
|
||||||
bot.reply_to(message, str_weekly_board + "\nNo users have scored yet.", parse_mode='MARKDOWN')
|
bot.reply_to(message, str_weekly_board + "\nNo users have scored yet.", parse_mode='MARKDOWN')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
bot.reply_to(message, str_weekly_board, parse_mode='MARKDOWN')
|
bot.reply_to(message, str_weekly_board, parse_mode='MARKDOWN')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@bot.message_handler(commands=['challenge', 'Challenge'])
|
|
||||||
def send_challenge(message):
|
|
||||||
"""send challenge to user
|
|
||||||
|
|
||||||
Args:
|
|
||||||
message (Message): Message from telegram user, here /challenge
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
None: None
|
|
||||||
|
|
||||||
Raises:
|
|
||||||
None: None
|
|
||||||
|
|
||||||
"""
|
|
||||||
bot.reply_to(message, "Challenge not implemented yet")
|
|
||||||
|
|
||||||
|
|
||||||
@bot.message_handler(commands=['changename', 'Changename'])
|
@bot.message_handler(commands=['changename', 'Changename'])
|
||||||
def change_name(message):
|
def change_name(message):
|
||||||
"""change user name
|
"""change user name
|
||||||
@ -471,7 +452,7 @@ def change_name_setter(message):
|
|||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
None: None
|
None: None
|
||||||
|
|
||||||
Test:
|
Test:
|
||||||
type in correct regex pattern and check if bot changes user name correctly, also in db
|
type in correct regex pattern and check if bot changes user name correctly, also in db
|
||||||
type in wrong regex pattern and check if bot responds with Invalid format message
|
type in wrong regex pattern and check if bot responds with Invalid format message
|
||||||
@ -504,7 +485,7 @@ def change_name_setter(message):
|
|||||||
def time_in_range(start, end, current):
|
def time_in_range(start, end, current):
|
||||||
"""Returns whether current is in the range [start, end]""" # docstring is missing!!!!!
|
"""Returns whether current is in the range [start, end]""" # docstring is missing!!!!!
|
||||||
return start <= current <= end
|
return start <= current <= end
|
||||||
|
|
||||||
@bot.message_handler(commands=['daily', 'Daily'])
|
@bot.message_handler(commands=['daily', 'Daily'])
|
||||||
def daily_message(message):
|
def daily_message(message):
|
||||||
"""change user name
|
"""change user name
|
||||||
@ -520,27 +501,27 @@ def daily_message(message):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
user_id = int(message.from_user.id)
|
user_id = int(message.from_user.id)
|
||||||
|
|
||||||
start = datetime.time(8, 0, 0)
|
start = datetime.time(8, 0, 0)
|
||||||
end = datetime.time(21, 0, 0)
|
end = datetime.time(21, 0, 0)
|
||||||
current = datetime.datetime.now().time()
|
current = datetime.datetime.now().time()
|
||||||
|
|
||||||
if not time_in_range(start, end, current):
|
if not time_in_range(start, end, current):
|
||||||
bot.send_message(chat_id=user_id, text="Currently there is no challenge.\n\n"
|
bot.send_message(chat_id=user_id, text="Currently there is no challenge.\n\n"
|
||||||
"Times are 8am to 10pm.")
|
"Times are 8am to 10pm.")
|
||||||
return
|
return
|
||||||
|
|
||||||
bot.send_message(chat_id = user_id, text="Welcome to todays challenge!\n"
|
bot.send_message(chat_id = user_id, text="Welcome to todays challenge!\n"
|
||||||
"As soon as the picture loads\n"
|
"As soon as the picture loads\n"
|
||||||
"you will have 35 seconds to send\n"
|
"you will have 35 seconds to send\n"
|
||||||
"your price guess\n")
|
"your price guess\n")
|
||||||
|
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|
||||||
bot.send_message(chat_id = user_id, text="Lets Go!")
|
bot.send_message(chat_id = user_id, text="Lets Go!")
|
||||||
|
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
for i in range(3):
|
for i in range(3):
|
||||||
iteration = 3-i
|
iteration = 3-i
|
||||||
bot.send_message(chat_id=user_id, text=str(iteration))
|
bot.send_message(chat_id=user_id, text=str(iteration))
|
||||||
@ -548,6 +529,7 @@ def daily_message(message):
|
|||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@bot.message_handler(commands=['addproduct', 'Addproduct'])
|
@bot.message_handler(commands=['addproduct', 'Addproduct'])
|
||||||
def add_product(message):
|
def add_product(message):
|
||||||
"""Add product to database
|
"""Add product to database
|
||||||
@ -670,32 +652,6 @@ def main_loop():
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
bot.infinity_polling()
|
bot.infinity_polling()
|
||||||
|
|
||||||
while 1:
|
|
||||||
product_split = UPDATE_PRODUCT.split(" ")
|
|
||||||
my_scheduler = BackgroundScheduler()
|
|
||||||
my_scheduler.add_job(get_todays_product, 'cron'\
|
|
||||||
,day_of_week = product_split[4]\
|
|
||||||
,hour= product_split[1]\
|
|
||||||
,minute = product_split[0]\
|
|
||||||
,month= product_split[3]\
|
|
||||||
,day=product_split[2])
|
|
||||||
|
|
||||||
my_scheduler.start()
|
|
||||||
|
|
||||||
print(f"Scheduler started for {product_split}")
|
|
||||||
|
|
||||||
time.sleep(10000)
|
|
||||||
|
|
||||||
print("Restarting scheduler")
|
|
||||||
|
|
||||||
my_scheduler.shutdown()
|
|
||||||
|
|
||||||
|
|
||||||
def get_todays_product():
|
|
||||||
"""Setting product for this day
|
|
||||||
"""
|
|
||||||
print(pandas.DataFrame(session.query(Product.price,Product.image_link).all()))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -11,6 +11,7 @@ import time
|
|||||||
import sys
|
import sys
|
||||||
from apscheduler.schedulers.background import BackgroundScheduler
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||||||
import pandas
|
import pandas
|
||||||
|
import random
|
||||||
|
|
||||||
from bot import bot
|
from bot import bot
|
||||||
from db import User, session, Product
|
from db import User, session, Product
|
||||||
@ -18,6 +19,7 @@ from db import User, session, Product
|
|||||||
|
|
||||||
CHALLENGE_READY = "0 8 * * *"
|
CHALLENGE_READY = "0 8 * * *"
|
||||||
CHALLENGE_OVER = "0 22 * * *"
|
CHALLENGE_OVER = "0 22 * * *"
|
||||||
|
GET_NEW_PRODUCT = "0 0 * * *"
|
||||||
|
|
||||||
def start_challenges():
|
def start_challenges():
|
||||||
"""Start the daily challenges, read the crontag codes and send messages
|
"""Start the daily challenges, read the crontag codes and send messages
|
||||||
@ -26,22 +28,57 @@ def start_challenges():
|
|||||||
|
|
||||||
over_split = CHALLENGE_OVER.split(" ")
|
over_split = CHALLENGE_OVER.split(" ")
|
||||||
|
|
||||||
|
new_product_split = GET_NEW_PRODUCT.split(" ")
|
||||||
|
|
||||||
my_scheduler = BackgroundScheduler()
|
my_scheduler = BackgroundScheduler()
|
||||||
|
|
||||||
|
# Sending the current event at the given crontags
|
||||||
|
# Challenge ready
|
||||||
my_scheduler.add_job(send_current_event, 'cron'\
|
my_scheduler.add_job(send_current_event, 'cron'\
|
||||||
,day_of_week = ready_split[4] , hour= ready_split[1] , minute = ready_split[0], month= ready_split[3] , day=ready_split[2]\
|
, day_of_week = ready_split[4] \
|
||||||
|
, hour= ready_split[1] \
|
||||||
|
, minute = ready_split[0]\
|
||||||
|
, month= ready_split[3] \
|
||||||
|
, day=ready_split[2]\
|
||||||
,args = ("start", ))
|
,args = ("start", ))
|
||||||
|
|
||||||
|
# Challenge over
|
||||||
my_scheduler.add_job(send_current_event, 'cron'\
|
my_scheduler.add_job(send_current_event, 'cron'\
|
||||||
,day_of_week = over_split[4] , hour= over_split[1] , minute = over_split[0], month= over_split[3] , day=over_split[2]\
|
, day_of_week = over_split[4] \
|
||||||
|
, hour= over_split[1] \
|
||||||
|
, minute = over_split[0]\
|
||||||
|
, month= over_split[3] \
|
||||||
|
, day=over_split[2]\
|
||||||
,args = ("over", ))
|
,args = ("over", ))
|
||||||
|
|
||||||
|
# Get new product
|
||||||
|
my_scheduler.add_job(get_todays_product, 'cron'\
|
||||||
|
,day_of_week = new_product_split[4] \
|
||||||
|
, hour= new_product_split[1] \
|
||||||
|
, minute = new_product_split[0]\
|
||||||
|
, month= new_product_split[3]\
|
||||||
|
, day=new_product_split[2])
|
||||||
|
|
||||||
my_scheduler.start()
|
my_scheduler.start()
|
||||||
|
|
||||||
time.sleep( 3600 )
|
time.sleep( 3600 )
|
||||||
my_scheduler.shutdown()
|
my_scheduler.shutdown()
|
||||||
start_challenges()
|
start_challenges()
|
||||||
|
|
||||||
|
def get_todays_product():
|
||||||
|
"""Get a random product from the database
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Product: random product
|
||||||
|
"""
|
||||||
|
products = []
|
||||||
|
for element in session.query(Product).all():
|
||||||
|
products.append(element)
|
||||||
|
|
||||||
|
# choose random product
|
||||||
|
random_product = products[int(len(products) * random.random())]
|
||||||
|
|
||||||
|
return random_product
|
||||||
|
|
||||||
|
|
||||||
def send_current_event(str_event):
|
def send_current_event(str_event):
|
||||||
@ -51,25 +88,26 @@ def send_current_event(str_event):
|
|||||||
str_event (String): event to send
|
str_event (String): event to send
|
||||||
"""
|
"""
|
||||||
all_users = pandas.DataFrame(session.query(User.telegram_id).all())
|
all_users = pandas.DataFrame(session.query(User.telegram_id).all())
|
||||||
|
|
||||||
if str_event == "start":
|
if str_event == "start":
|
||||||
for element in all_users["telegram_id"]:
|
for element in all_users["telegram_id"]:
|
||||||
bot.send_message(chat_id=int(element), text="Todays challenge is available!\nTry /daily to give it a try :)")
|
bot.send_message(chat_id=int(element), text="Todays challenge is available!\n"\
|
||||||
|
"Try /daily to give it a try :)")
|
||||||
elif str_event == "over":
|
elif str_event == "over":
|
||||||
for element in all_users["telegram_id"]:
|
for element in all_users["telegram_id"]:
|
||||||
bot.send_message(chat_id=int(element), text="Todays challenge is over!\nCheck the /scoreboard to see the leaderboard!")
|
bot.send_message(chat_id=int(element), text="Todays challenge is over!\n"\
|
||||||
|
"Check the /scoreboard to see the leaderboard!")
|
||||||
else:
|
else:
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
send_current_event("start")
|
||||||
|
time.sleep(10)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
test = pandas.DataFrame(session.query(User.telegram_id).all())
|
|
||||||
for element in test["telegram_id"]:
|
|
||||||
print(element)
|
|
||||||
start_challenges()
|
start_challenges()
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print("Ending")
|
print("Ending")
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user