You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
6.7 KiB
Python

import os
import time
import toml
from peewee import SqliteDatabase, PostgresqlDatabase
import db_modell as db
from telegram_api import telegram_bot_api as api
def load_config():
configfile = os.path.join(SKRIPTPFAD, "config_fotobot.toml")
with open(configfile) as conffile:
config = toml.loads(conffile.read())
return config
SKRIPTPFAD = os.path.abspath(os.path.dirname(__file__))
CONFIG = load_config()
# Nur für Testzwecke!
CONFIG["root_verzeichnis"] = SKRIPTPFAD
if CONFIG["db_adapter"] == "sqlite":
db.DB_PROXY.initialize(SqliteDatabase(os.path.join(SKRIPTPFAD, "datenbank.db3")))
elif CONFIG["db_adapter"] == "postgres":
db.DB_PROXY.initialize(PostgresqlDatabase(CONFIG["pg"]["database"],
user=CONFIG["pg"]["user"],
password=CONFIG["pg"]["password"]))
else:
raise NameError("db_adapter: {} nicht gefunden".format(CONFIG["db_adapter"]))
class FotoBot(api.Bot):
def __init__(self, token):
super().__init__(token)
self.menue = None
self.umenue = None
self.undefinierte_file_id = None
self.undefinierte_message_id = None
self.bot_kommando = {
"undefiniertefotos": self.undefinierte_fotos_verarbeiten
}
def message_handler(self, message):
if self.menue is not None:
self.menue(message)
return
def bot_kommando_exec(self, kommando, message):
self.menue = self.bot_kommando.get(kommando, self.kommando_unbekannt)
self.menue(message)
def undefinierte_fotos_verarbeiten(self, message):
"""
Ist self.umenue auf None, so wird der parameter zu undefiniertes_foto
Ist self.umenue auf 1, so wird parameter zur message
"""
self.menue = self.undefinierte_fotos_verarbeiten
if self.umenue is None:
for undefiniertes_foto in db.FotoUndefiniert.select():
self.send_message(chat_id=undefiniertes_foto.chat_id,
text="Ordner und Notiz angeben",
reply_to_message_id=undefiniertes_foto.message_id)
self.undefinierte_file_id = undefiniertes_foto.file_id
self.undefinierte_message_id = undefiniertes_foto.message_id
self.umenue = 1
break
else:
self.menue = None
self.umenue = None
elif self.umenue == 1:
ordner, notiz = caption_analysieren(message["message"]["text"])
ordner_db_id = db.ordner_struktur_erstellen(ordner)
verzeichnis = verzeichnis_erstellen(ordner)
file_id = db.FotoUndefiniert.select(db.FotoUndefiniert.file_id).where(
db.FotoUndefiniert.message_id == self.undefinierte_message_id).scalar()
file, file_path = self.get_file(file_id)
dateiendung = get_dateiendung(file_path)
file_name = db.file_speichern(ordner_db_id, notiz, dateiendung)
datei_speichern(verzeichnis, file_name, file)
db.FotoUndefiniert.delete().where(db.FotoUndefiniert.message_id == self.undefinierte_message_id).execute()
self.umenue = None
if db.FotoUndefiniert.get_or_none() is None:
self.menue = None
else:
self.undefinierte_fotos_verarbeiten("_")
@staticmethod
def kommando_unbekannt(_):
print("Unbekannt")
def verzeichnis_erstellen(ordner):
verzeichnis = os.path.join(CONFIG["root_verzeichnis"], *ordner)
os.makedirs(verzeichnis, mode=0o770, exist_ok=True)
return verzeichnis
def get_biggest_size(photos):
max_file_size = 0
max_index = None
for index, photo in enumerate(photos):
if photo["file_size"] > max_file_size:
max_index = index
return max_index
def datei_speichern(verzeichnis, file_name, inhalt):
file = os.path.join(verzeichnis, file_name)
with open(file, "wb") as file_:
file_.write(inhalt)
def caption_analysieren(caption):
caption_split = caption.split(";")
ordner = caption_split[0].split(",")
ordner = [ordner_einzel.replace(" ", "") for ordner_einzel in ordner]
try:
notizen = caption_split[1]
if notizen.startswith(" "):
notizen = notizen.replace(" ", "", 1)
except IndexError:
notizen = []
return ordner, notizen
def get_dateiendung(file_path):
return file_path.split(".")[-1]
def nachricht_auswerten(bot, message):
absender = message["message"]["from"].get("id", 0)
if absender not in CONFIG["erlaubte_telegram_ids"]:
bot.send_message(absender, "User nicht freigegeben")
return
if bot.menue is None:
if "entities" in message["message"]:
if "bot_command" in message["message"]["entities"][0]["type"]:
text = message["message"]["text"]
kommando = text.replace("/", "")
bot.bot_kommando_exec(kommando, message)
if "photo" in message["message"]:
max_index = get_biggest_size(message["message"]["photo"])
if "caption" in message["message"]:
ordner, notiz = caption_analysieren(message["message"]["caption"])
ordner_db_id = db.ordner_struktur_erstellen(ordner)
verzeichnis = verzeichnis_erstellen(ordner)
file, file_path = bot.get_file(message["message"]["photo"][max_index]["file_id"])
dateiendung = get_dateiendung(file_path)
file_name = db.file_speichern(ordner_db_id, notiz, dateiendung)
datei_speichern(verzeichnis, file_name, file)
else:
bot.send_message(chat_id=absender,
text="Bild kann nicht verabeitet werden, Ordner wurde nicht angegeben",
reply_to_message_id=message["message"]["message_id"])
db.FotoUndefiniert.create(message_id=message["message"]["message_id"],
chat_id=absender,
file_id=message["message"]["photo"][max_index]["file_id"])
else:
bot.menue(message)
def main():
bot = FotoBot(CONFIG["token"])
db.db_create_table()
db.update_root_verzeichnis(CONFIG["root_verzeichnis"])
while True:
nachricht_vorhanden = False
for message in bot.get_updates():
nachricht_vorhanden = True
nachricht_auswerten(bot, message)
if not nachricht_vorhanden and bot.menue is None:
break
time.sleep(0.1)
if __name__ == "__main__":
main()