-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.py
More file actions
69 lines (57 loc) · 2.73 KB
/
bot.py
File metadata and controls
69 lines (57 loc) · 2.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"""Simple Telegram Bot which parse .xlsx file by user message pattern"""
import os
import sys
import logging
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
from openpyxl import load_workbook
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
XLSX_FILE_PATH = os.getenv("XLSX_FILE_PATH")
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', stream=sys.stdout)
async def find(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Function which parse excel file by user message and send response to Telegram Bot"""
if update.message and update.message.text:
workbook = load_workbook(XLSX_FILE_PATH)
sheet = workbook.active
headers = get_headers(sheet)
keywords_column = headers.get('Keywords')
links_column = headers.get('Link')
tencode_column = headers.get('Ten-code')
name_column = headers.get('Name')
parsed_message = update.message.text.replace("/f", "").strip()
user = update.effective_user
response_message = ''
logging.info(f"User {user.first_name} (@{user.username or 'no_username'}) ID:{user.id} uses /f")
if any(char.isdigit() for char in parsed_message):
if tencode_column:
for row in sheet.iter_rows():
tencode = str(row[tencode_column - 1].value)
if parsed_message == tencode:
response_message += f"{row[name_column - 1].value} : {row[links_column - 1].value}\n"
else:
if keywords_column and links_column:
for row in sheet.iter_rows():
keywords = str(row[keywords_column - 1].value).split(";")
trimmed_keywords = [s.lstrip() for s in keywords]
lower_keywords = [s.lower() for s in trimmed_keywords]
if parsed_message.lower() in lower_keywords:
response_message += f"{row[name_column - 1].value} : {row[links_column - 1].value}\n"
if response_message == '':
response_message += "Not Found"
await update.message.reply_text(f"{response_message}")
def get_headers(sheet: any ) -> dict:
"""Function which return excel column ids and cells as dictionary"""
headers = {}
for col_idx, cell in enumerate(sheet[1], start=1):
headers[cell.value] = col_idx
return headers
def main():
"""Main function"""
try:
app = ApplicationBuilder().token(TELEGRAM_BOT_TOKEN).build()
app.add_handler(CommandHandler("f", find))
app.run_polling()
except Exception as err:
logging.error(f"Unexpected {err=}, {type(err)=}")
if __name__ == "__main__":
main()