Merge branch 'feature/memory'
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Remy Moll 2023-05-14 22:11:42 +02:00
commit 5eaec538a2
5 changed files with 172 additions and 15 deletions

View File

@ -2,7 +2,7 @@ import datetime
import os import os
from telegram.ext import ConversationHandler, CommandHandler, MessageHandler, filters, CallbackQueryHandler from telegram.ext import ConversationHandler, CommandHandler, MessageHandler, filters, CallbackQueryHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram import InlineKeyboardButton, InlineKeyboardMarkup
ACTION_CHOICE, DATE_ENTRY, ADD_CONTENT, DELETE_ENTRY = range(4) ACTION_CHOICE, DATE_ENTRY, ADD_CONTENT = range(3)
from .basehandler import BaseHandler from .basehandler import BaseHandler
@ -23,9 +23,6 @@ class JournalHandler(BaseHandler):
], ],
ADD_CONTENT: [ ADD_CONTENT: [
MessageHandler(filters.ALL, self.content_save), MessageHandler(filters.ALL, self.content_save),
],
DELETE_ENTRY: [
MessageHandler(filters.ALL, self.delete_entry),
] ]
}, },
fallbacks=[], fallbacks=[],
@ -71,7 +68,7 @@ class JournalHandler(BaseHandler):
) )
if new: if new:
await query.edit_message_text( await query.edit_message_text(
text=f"What is your entry for {self.current_model.date.strftime('%A, %-d. %B %Y')}?" text=f"What is your entry for {self.current_model.date_pretty}?"
) )
else: else:
await query.edit_message_text(text="An entry already exists for this date") await query.edit_message_text(text="An entry already exists for this date")
@ -102,7 +99,7 @@ class JournalHandler(BaseHandler):
date = date date = date
) )
if self.current_model: if self.current_model:
return DELETE_ENTRY await self.delete_entry(update, context)
else: else:
await update.message.reply_text("No entry found for this date") await update.message.reply_text("No entry found for this date")
context.chat_data["delete"] = False context.chat_data["delete"] = False
@ -116,7 +113,7 @@ class JournalHandler(BaseHandler):
await update.message.reply_text("An entry already exists for this date") await update.message.reply_text("An entry already exists for this date")
return ConversationHandler.END return ConversationHandler.END
else: else:
await update.message.reply_text(f"What is your entry for {self.current_model.date.strftime('%A, %-d. %B %Y')}?") await update.message.reply_text(f"What is your entry for {self.current_model.date_pretty}?")
return ADD_CONTENT return ADD_CONTENT
@ -156,5 +153,4 @@ class JournalHandler(BaseHandler):
with self.models.db: with self.models.db:
self.current_model.delete_instance() self.current_model.delete_instance()
context.chat_data["delete"] = False context.chat_data["delete"] = False
await update.callback_query.edit_message_text(text="Entry deleted ✅") await update.message.reply_text(text="Entry deleted ✅")
return ConversationHandler.END

96
bot/commands/memory.py Normal file
View File

@ -0,0 +1,96 @@
import datetime
from telegram.ext import ConversationHandler, CommandHandler, MessageHandler, filters, CallbackQueryHandler, CallbackContext
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update, InputMediaPhoto
# ACTION_CHOICE, DATE_ENTRY, ADD_CONTENT = range(3)
MEMORY_CHOICE = range(1)
from .basehandler import BaseHandler
class MemoryHandler(BaseHandler):
def __init__(self, entry_string, models):
self.models = models
self.entry_string = entry_string
self.handler = ConversationHandler(
entry_points=[CommandHandler(entry_string, self.entry_point, )],
states={
MEMORY_CHOICE: [
CallbackQueryHandler(self.choose_memory),
]
},
fallbacks=[],
)
self.current_model = None
async def entry_point(self, update: Update, context: CallbackContext):
await super().entry_point(update, context)
search_string = " ".join(context.args)
matching_models = self.models.JournalEntry.select().where(
self.models.JournalEntry.text.contains(
search_string
)
).order_by(self.models.JournalEntry.date)
# matches_string = ""
# for i,m in enumerate(matching_models):
# matches_string += "\n"+ f"{i+1}: " + m.date_pretty
options = [[InlineKeyboardButton(m.date_pretty, callback_data=i)] for i,m in enumerate(matching_models)]
keyboard = InlineKeyboardMarkup(options)
await update.message.reply_text(
f"Which moment would you like to remember?", reply_markup=keyboard
)
context.chat_data["kept_matches"] = list(matching_models)
return MEMORY_CHOICE
# for m in matching_models:
# # print(m.date)
# if m.media_path:
# await update.message.reply_photo(
# photo = m.media_path,
# caption =
# f"On {m.date}, "
# f"{m.author} wrote: \n"
# f"{m.text}"
# )
# else:
# await update.message.reply_text(
# f"On {m.date}, "
# f"{m.author} wrote: \n"
# f"{m.text}"
# )
# return ConversationHandler.END
async def choose_memory(self, update: Update, context: CallbackContext):
query = update.callback_query
ind = int(query.data)
await query.answer()
matching_models = context.chat_data["kept_matches"]
chosen_match = matching_models[ind]
if chosen_match.media_path:
# context.bot.sendPhoto()
await update.effective_message.reply_photo(
photo = chosen_match.media_path,
caption=
f"On {chosen_match.date_pretty}, "
f"{chosen_match.author} wrote: \n"
f"{chosen_match.text}"
)
else:
await query.edit_message_text(
f"On {chosen_match.date_pretty}, "
f"{chosen_match.author} wrote: \n"
f"{chosen_match.text}"
)
return ConversationHandler.END

View File

@ -1,13 +1,66 @@
import os
from pathlib import Path
from telegram.ext import ConversationHandler, CommandHandler, MessageHandler, filters, CallbackQueryHandler from telegram.ext import ConversationHandler, CommandHandler, MessageHandler, filters, CallbackQueryHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram import Update
import re
import random
import time
from .basehandler import BaseHandler from .basehandler import BaseHandler
MEDIA_DIR = Path(os.getenv("MEDIA_DIR"))
TURTLE_VIDEO_LOCATION = MEDIA_DIR / "turtle_reactions"
TURTLE_VIDEOS = list(TURTLE_VIDEO_LOCATION.glob("*.mp4"))
class TurtleHandler(BaseHandler): class TurtleHandler(BaseHandler):
def __init__(self): def __init__(self):
self.handler = MessageHandler(filters.Regex(r"Hallo|hallo"), self.entry_point) self.entry_string = "Variation of hallo"
self.handler = MessageHandler(filters.Regex(r"[hH]([aA]+|[eE]+)[lL]{2,}[oOöÖ]+(le)?|(chen)") | # react to hello strings
filters.Regex(b"\xF0\x9F\x90\xA2".decode("utf8")) | # react to turtle emoji
filters.Regex(r"[sS](childkröte)|[tT](urtle)"), # react to turtle string
self.entry_point)
pass pass
async def entry_point(self, update, context): async def entry_point(self, update: Update, context):
await super().entry_point(update, context) await super().entry_point(update, context)
update.message.reply_ msgtxt = update.message.text
turtle_emoji = b"\xF0\x9F\x90\xA2".decode("utf8")
if "hallo" in msgtxt: # react to hallo
vid = TURTLE_VIDEOS[0]
answertxt = "Hallo!"
elif re.search("[eE][lL]{2,}[oO]", msgtxt): # react to hello
vid = TURTLE_VIDEOS[2]
answertxt = "Hello!"
elif re.search("([aA]{4,}|[lL]{4,}|[oO]{4,}|[öÖ]{4,})", msgtxt): # react to stretched hello
vid = TURTLE_VIDEOS[5]
answertxt = "That's a lot of letters!"
elif re.search(turtle_emoji, msgtxt): # react to turtle emoji
vid=TURTLE_VIDEOS[0] # TODO: choose video for smiley reaction
answertxt="Turtle detected! Self-destruction mode activated..."
elif re.search("[sS](childkröte)|[tT](urtle)", msgtxt): # react to turtle string
vid=None
answertxt=turtle_emoji
else:
vid = random.choice(TURTLE_VIDEOS[1:2]+TURTLE_VIDEOS[3:5]+TURTLE_VIDEOS[6:])
answertxt = ""
if vid!=None:
if re.search(turtle_emoji, msgtxt):
await update.message.reply_text(text=answertxt)
time.sleep(1)
await update.message.reply_text(text="3")
time.sleep(1)
await update.message.reply_text(text="2")
time.sleep(1)
await update.message.reply_text(text="1")
time.sleep(1)
await update.message.reply_video(video=vid, caption="Kaboom!")
else:
await update.message.reply_video(video=vid, caption=answertxt)
else:
await update.message.reply_text(text=answertxt)

View File

@ -3,9 +3,10 @@ from telegram.ext import Application
import logging import logging
import models import models
from commands import journal, status from commands import journal, status, turtle, memory
from commands.list import list from commands.list import list
from cronjob import chat_photo from cronjob import chat_photo
logging.basicConfig( logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
level=logging.INFO level=logging.INFO
@ -27,6 +28,9 @@ def main() -> None:
application.add_handler(journal.JournalHandler("journal", models).handler) application.add_handler(journal.JournalHandler("journal", models).handler)
application.add_handler(list.ListHandler("list", models).handler) application.add_handler(list.ListHandler("list", models).handler)
application.add_handler(status.StatusHandler("status", models).handler) application.add_handler(status.StatusHandler("status", models).handler)
application.add_handler(turtle.TurtleHandler().handler)
application.add_handler(memory.MemoryHandler("memory", models).handler)
# application.add_handler(CommandHandler("help", help_command)) # application.add_handler(CommandHandler("help", help_command))
# on non command i.e message - echo the message on Telegram # on non command i.e message - echo the message on Telegram
# application.add_handler(InlineQueryHandler(inline_query)) # application.add_handler(InlineQueryHandler(inline_query))

View File

@ -1,6 +1,7 @@
from peewee import * from peewee import *
from pathlib import Path from pathlib import Path
import os import os
import datetime
ID_MAPPINGS = { ID_MAPPINGS = {
"Lia": 5603036217, "Lia": 5603036217,
@ -52,6 +53,13 @@ class JournalEntry(BaseModel):
self.save() self.save()
@property
def date_pretty(self) -> str:
try:
return self.date.strftime('%A, %-d. %B %Y')
except ValueError: #fck windows
return self.date.strftime('%a, %d. %b %Y')
def set_db(db_path): def set_db(db_path):
db.initialize(SqliteDatabase(db_path)) db.initialize(SqliteDatabase(db_path))