- add example config

- add command to configure time for reminds
- little refactoring in tg and for_db
This commit is contained in:
kr0sh512
2024-11-11 23:37:15 +03:00
parent 9959ee74d5
commit d7f499e5c6
7 changed files with 188 additions and 35 deletions
+2 -1
View File
@@ -1,3 +1,4 @@
config.yaml
database/*
__pycache__/*
__pycache__/*
old.py
+38
View File
@@ -0,0 +1,38 @@
# TG Keeper
TG Keeper bot allows you to store notes, display them at a specified interval, and recognizes date formats: DD.MM, DD month. It works both in group chats by mentioning @username_bot and in private messages.
## Features
- Convenient setup interface
- Dependency installation via `requirements.txt`
- Initial configuration in the `config.yaml` file
## Installation
1. Clone the repository:
```sh
git clone https://github.com/yourusername/tg-keeper.git
```
2. Navigate to the project directory:
```sh
cd tg-keeper
```
3. Install the dependencies:
```sh
pip install -r requirements.txt
```
## Configuration
1. Open the `config.yaml` file and configure the parameters as you wish.
## Usage
Run the bot:
```sh
python bot.py
```
Now you can add and manage your notes through TG Keeper.
+6
View File
@@ -0,0 +1,6 @@
admin_id: "856850518"
api_token: null
test_token: null
bot_username: "@keeper_inbot"
users_path: "database/users.yaml"
user_path: "database/users/{}.yaml"
+47 -29
View File
@@ -23,37 +23,20 @@ def new_user(message: types.Message) -> bool:
if check_user(message.chat.id):
return False
user = {
"id": message.chat.id,
"type": message.chat.type,
"username": message.chat.username,
"first_name": message.chat.first_name,
"last_name": message.chat.last_name,
"time_created": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"last_message": None,
"remind_delta": 12 * 60 * 60, # 12 часов по умолчанию
}
users = yaml.safe_load(open(users_path, "r"), encoding="utf-8")
if not users:
users = {}
users[user["id"]] = user
yaml_data = yaml.dump(
users,
default_flow_style=False,
encoding="utf-8",
allow_unicode=True,
width=float("inf"),
sort_keys=False,
update_user_settings(message.chat.id, "id", message.chat.id)
update_user_settings(message.chat.id, "type", message.chat.type)
update_user_settings(message.chat.id, "username", message.chat.username)
update_user_settings(message.chat.id, "first_name", message.chat.first_name)
update_user_settings(message.chat.id, "last_name", message.chat.last_name)
update_user_settings(
message.chat.id, "time_created", datetime.now().strftime("%Y-%m-%d %H:%M:%S")
)
update_user_settings(message.chat.id, "last_message", None)
update_user_settings(
message.chat.id, "remind_delta", 12 * 60 * 60
) # 12 часов по умолчанию
with open(users_path, "wb") as file:
file.write(yaml_data)
return True
return
def add_note(
@@ -233,3 +216,38 @@ def check_old_notes() -> list[int, str, int]: # возвращает перву
return user_id, list, ind
return None, None, None
def update_user_settings(user_id: int, param: str, value: any) -> bool:
users = yaml.safe_load(open(users_path, "r", encoding="utf-8"))
if not users:
users = {}
if user_id not in users:
users[user_id] = {}
users[user_id][param] = value
yaml_data = yaml.dump(
users,
default_flow_style=False,
encoding="utf-8",
allow_unicode=True,
width=float("inf"),
sort_keys=False,
)
with open(users_path, "wb") as file:
file.write(yaml_data)
return True
def user_settings(user_id: int) -> dict:
if not check_user(user_id):
return None
users = yaml.safe_load(open(users_path, "r", encoding="utf-8"))
return users[user_id]
+1
View File
@@ -12,3 +12,4 @@
error_message: "Произошла ошибка. \
\nПожалуйста, попробуйте снова или свяжитесь с @Kr0sH_512"
no_reminders: "У вас нет напоминаний."
not_registered: "Пожалуйста, воспользуйтесь сперва командой /start"
+4
View File
@@ -0,0 +1,4 @@
pyyaml
pytelegrambotapi
schedule
python-telegram-bot
+90 -5
View File
@@ -45,6 +45,9 @@ def start(message: types.Message):
send_message(message, lang["start_message"])
if not db.check_user(message.chat.id):
db.new_user(message)
return
@@ -54,6 +57,9 @@ def help(message: types.Message):
send_message(message, help_msg)
if not db.check_user(message.chat.id):
db.new_user(message)
return
@@ -187,13 +193,89 @@ def choose_note_callback(call):
return
@bot.message_handler(commands=["settings", "setting", "edit"])
def display_settings(message: types.Message):
@bot.callback_query_handler(func=lambda call: "edit_time" in call.data)
def edit_time(call):
list_time = {
(24 - 8) * 3600: "8:00 в день до напоминания",
(24 - 12) * 3600: "12:00 в день до напоминания",
(24 - 18) * 3600: "18:00 в день до напоминания",
0: "0:00 в день до напоминания",
(-8) * 3600: "8:00 в день напоминания",
(-12) * 3600: "12:00 в день напоминания",
(-18) * 3600: "18:00 в день напоминания",
}
if call.data[-1] == "#":
markup = types.InlineKeyboardMarkup()
for delta in list_time.keys():
markup.add(
types.InlineKeyboardButton(
list_time[delta],
callback_data=f"edit_time^{delta}",
)
)
bot.edit_message_text(
"⏰ Выберите время для уведомлений:",
call.message.chat.id,
call.message.message_id,
reply_markup=markup,
)
return
delta = int(call.data.split("^")[1])
db.update_user_settings(call.message.chat.id, "remind_delta", delta)
bot.edit_message_text(
f"Выбранное время: \n\n{list_time[delta]}",
call.message.chat.id,
call.message.message_id,
)
return
@bot.message_handler(commands=["list"])
@bot.message_handler(commands=["settings", "setting", "edit"])
def display_settings(message: types.Message):
if not db.check_user(message.chat.id):
db.new_user(message)
settings_msg = "Изменить время отправки напоминания"
markup = types.InlineKeyboardMarkup()
markup.add(
types.InlineKeyboardButton(
"Изменить время",
callback_data="edit_time#",
)
)
send_message(message, settings_msg, markup)
return
settings = db.user_settings(message.chat.id)
# if not settings:
# send_message(message, lang["not_registered"])
# return
settings_msg = "⚙️ <u>Настройки</u>:\
\n\nВремя до отправки уведомления: <b>{}</b>"
markup = types.InlineKeyboardMarkup()
markup.add(
types.InlineKeyboardButton(
"Изменить время",
callback_data="edit_time#",
)
)
return
@bot.message_handler(commands=["list", "lists", "l"])
def list_notes(message: types.Message, list: str = "Default", edit: bool = False):
notes = db.get_notes(message.chat.id, list)
@@ -242,14 +324,15 @@ def text_message(message: types.Message):
return # ignore messages from supergroups
if db.check_user(message.chat.id) is None:
if not db.check_user(message.chat.id):
db.new_user(message)
message.text = message.text.replace(f"{bot_username}", "").strip()
if not message.text:
if not message.reply_to_message:
return
message.text = message.reply_to_message.text
# message.text = message.reply_to_message.text
message = message.reply_to_message
date_patterns = [
r"\b\d{1,2}\s(?:января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)\b",
@@ -328,6 +411,8 @@ def send_message(
if not thread_id:
thread_id = message.message_thread_id
msg = None
try:
msg = bot.send_message(
chat_id=id,