# Copyright (C) 2019 The Raphielscape Company LLC.
#
# Licensed under the Raphielscape Public License, Version 1.c (the "License");
# you may not use this file except in compliance with the License.
#

# Asena UserBot - Yusuf Usta

""" UserBot baÅŸlangÄ±Ã§ noktasÄ± """
import importlib
from importlib import import_module
from sqlite3 import connect
import os
import requests
from telethon.tl.types import InputMessagesFilterDocument
from telethon.errors.rpcerrorlist import PhoneNumberInvalidError
from telethon.tl.functions.channels import GetMessagesRequest
from . import BRAIN_CHECKER, LOGS, bot, PLUGIN_CHANNEL_ID, CMD_HELP, LANGUAGE, ASENA_VERSION, PATTERNS
from .modules import ALL_MODULES
import userbot.modules.sql_helper.mesaj_sql as MSJ_SQL
import userbot.modules.sql_helper.galeri_sql as GALERI_SQL
from pySmartDL import SmartDL
from telethon.tl import functions

from random import choice
import chromedriver_autoinstaller
from json import loads, JSONDecodeError
import re
import userbot.cmdhelp

DIZCILIK_STR = [
    "Ã‡Ä±kartmayÄ± dÄ±zlÄ±yorum...",
    "YaÅŸasÄ±n dÄ±zcÄ±lÄ±k...",
    "Bu Ã§Ä±kartmayÄ± kendi paketime davet ediyorum...",
    "Bunu dÄ±zlamam lazÄ±m...",
    "Hey bu gÃ¼zel bir Ã§Ä±kartma!\nHemen dÄ±zlÄ±yorum..",
    "Ã‡Ä±kartmanÄ± dÄ±zlÄ±yorum\nhahaha.",
    "Hey ÅŸuraya bak. (â˜‰ï½¡â˜‰)!â†’\nBen bunu dÄ±zlarken...",
    "GÃ¼ller kÄ±rmÄ±zÄ± menekÅŸeler mavi, bu Ã§Ä±kartmayÄ± paketime dÄ±zlayarak havalÄ± olacaÄŸÄ±m...",
    "Ã‡Ä±kartma hapsediliyor...",
    "Bay dÄ±zcÄ± bu Ã§Ä±kartmayÄ± dÄ±zlÄ±yor... ",
]

AFKSTR = [
    "Åžu an acele iÅŸim var, daha sonra mesaj atsan olmaz mÄ±? Zaten yine geleceÄŸim.",
    "AradÄ±ÄŸÄ±nÄ±z kiÅŸi ÅŸu anda telefona cevap veremiyor. Sinyal sesinden sonra kendi tarifeniz Ã¼zerinden mesajÄ±nÄ±zÄ± bÄ±rakabilirsiniz. Mesaj Ã¼creti 49 kuruÅŸtur. \n`biiiiiiiiiiiiiiiiiiiiiiiiiiiiip`!",
    "BirkaÃ§ dakika iÃ§inde geleceÄŸim. Fakat gelmezsem...\ndaha fazla bekle.",
    "Åžu an burada deÄŸilim, muhtemelen baÅŸka bir yerdeyim.",
    "GÃ¼ller kÄ±rmÄ±zÄ±\nMenekÅŸeler mavi\nBana bir mesaj bÄ±rak\nVe sana dÃ¶neceÄŸim.",
    "Bazen hayattaki en iyi ÅŸeyler beklemeye deÄŸerâ€¦\nHemen dÃ¶nerim.",
    "Hemen dÃ¶nerim,\nama eÄŸer geri dÃ¶nmezsem,\ndaha sonra dÃ¶nerim.",
    "HenÃ¼z anlamadÄ±ysan,\nburada deÄŸilim.",
    "Merhaba, uzak mesajÄ±ma hoÅŸ geldiniz, bugÃ¼n sizi nasÄ±l gÃ¶rmezden gelebilirim?",
    "7 deniz ve 7 Ã¼lkeden uzaktayÄ±m,\n7 su ve 7 kÄ±ta,\n7 daÄŸ ve 7 tepe,\n7 ovala ve 7 hÃ¶yÃ¼k,\n7 havuz ve 7 gÃ¶l,\n7 bahar ve 7 Ã§ayÄ±r,\n7 ÅŸehir ve 7 mahalle,\n7 blok ve 7 ev...\n\nMesajlarÄ±n bile bana ulaÅŸamayacaÄŸÄ± bir yer!",
    "Åžu anda klavyeden uzaktayÄ±m, ama ekranÄ±nÄ±zda yeterince yÃ¼ksek sesle Ã§Ä±ÄŸlÄ±k atarsanÄ±z, sizi duyabilirim.",
    "Åžu yÃ¶nde ilerliyorum\n---->",
    "Åžu yÃ¶nde ilerliyorum\n<----",
    "LÃ¼tfen mesaj bÄ±rakÄ±n ve beni zaten olduÄŸumdan daha Ã¶nemli hissettirin.",
    "Sahibim burada deÄŸil, bu yÃ¼zden bana yazmayÄ± bÄ±rak.",
    "Burada olsaydÄ±m,\nSana nerede olduÄŸumu sÃ¶ylerdim.\n\nAma ben deÄŸilim,\ngeri dÃ¶ndÃ¼ÄŸÃ¼mde bana sor...",
    "UzaklardayÄ±m!\nNe zaman dÃ¶nerim bilmiyorum !\nUmarÄ±m birkaÃ§ dakika sonra!",
    "Sahibim ÅŸuan da mÃ¼sait deÄŸil. AdÄ±nÄ±zÄ±, numarÄ±nÄ±zÄ± ve adresinizi verirseniz ona iletibilirm ve bÃ¶ylelikle geri dÃ¶ndÃ¼ÄŸÃ¼ zaman.",
    "ÃœzgÃ¼nÃ¼m, sahibim burada deÄŸil.\nO gelene kadar benimle konuÅŸabilirsiniz.\nSahibim size sonra dÃ¶ner.",
    "Bahse girerim bir mesaj bekliyordun!",
    "Hayat Ã§ok kÄ±sa, yapacak Ã§ok ÅŸey var...\nOnlardan birini yapÄ±yorum...",
    "Åžu an burada deÄŸilim....\nama Ã¶yleysem ...\n\nbu harika olmaz mÄ±ydÄ±?",
]

UNAPPROVED_MSG = ("`Hey,` {mention}`! Bu bir bot. EndiÅŸelenme.\n\n`"
                  "`Sahibim sana PM atma izni vermedi. `"
                  "`LÃ¼tfen sahibimin aktif olmasÄ±nÄ± bekleyin, o genellikle PM'leri onaylar.\n\n`"
                  "`BildiÄŸim kadarÄ±yla o kafayÄ± yemiÅŸ insanlara PM izni vermiyor.`")

DB = connect("learning-data-root.check")
CURSOR = DB.cursor()
CURSOR.execute("""SELECT * FROM BRAIN1""")
ALL_ROWS = CURSOR.fetchall()
INVALID_PH = '\nHATA: Girilen telefon numarasÄ± geÃ§ersiz' \
             '\n  Ipucu: Ãœlke kodunu kullanarak numaranÄ± gir' \
             '\n       Telefon numaranÄ±zÄ± tekrar kontrol edin'

for i in ALL_ROWS:
    BRAIN_CHECKER.append(i[0])
connect("learning-data-root.check").close()

def extractCommands(file):
    FileRead = open(file, 'r').read()
    
    if '/' in file:
        file = file.split('/')[-1]

    Pattern = re.findall(r"@register\(.*pattern=(r|)\"(.*)\".*\)", FileRead)
    Komutlar = []

    if re.search(r'CmdHelp\(.*\)', FileRead):
        pass
    else:
        dosyaAdi = file.replace('.py', '')
        CmdHelp = userbot.cmdhelp.CmdHelp(dosyaAdi, False)

        # KomutlarÄ± AlÄ±yoruz #
        for Command in Pattern:
            Command = Command[1]
            if Command == '' or len(Command) <= 1:
                continue
            Komut = re.findall("(^.*[a-zA-Z0-9ÅŸÄŸÃ¼Ã¶Ã§Ä±]\w)", Command)
            if (len(Komut) >= 1) and (not Komut[0] == ''):
                Komut = Komut[0]
                if Komut[0] == '^':
                    KomutStr = Komut[1:]
                    if KomutStr[0] == '.':
                        KomutStr = KomutStr[1:]
                    Komutlar.append(KomutStr)
                else:
                    if Command[0] == '^':
                        KomutStr = Command[1:]
                        if KomutStr[0] == '.':
                            KomutStr = KomutStr[1:]
                        else:
                            KomutStr = Command
                        Komutlar.append(KomutStr)

            # AsenaPY
            Asenapy = re.search('\"\"\"ASENAPY(.*)\"\"\"', FileRead, re.DOTALL)
            if not Asenapy == None:
                Asenapy = Asenapy.group(0)
                for Satir in Asenapy.splitlines():
                    if (not '"""' in Satir) and (':' in Satir):
                        Satir = Satir.split(':')
                        Isim = Satir[0]
                        Deger = Satir[1][1:]
                                
                        if Isim == 'INFO':
                            CmdHelp.add_info(Deger)
                        elif Isim == 'WARN':
                            CmdHelp.add_warning(Deger)
                        else:
                            CmdHelp.set_file_info(Isim, Deger)
            for Komut in Komutlar:
                # if re.search('\[(\w*)\]', Komut):
                    # Komut = re.sub('(?<=\[.)[A-Za-z0-9_]*\]', '', Komut).replace('[', '')
                CmdHelp.add_command(Komut, None, 'Bu plugin dÄ±ÅŸarÄ±dan yÃ¼klenmiÅŸtir. Herhangi bir aÃ§Ä±klama tanÄ±mlanmamÄ±ÅŸtÄ±r.')
            CmdHelp.add()

try:
    bot.start()
    idim = bot.get_me().id
    asenabl = requests.get('https://gitlab.com/Quiec/asen/-/raw/master/asen.json').json()
    if idim in asenabl:
        bot.disconnect()

    # ChromeDriver'Ä± AyarlayalÄ±m #
    try:
        chromedriver_autoinstaller.install()
    except:
        pass
    
    # Galeri iÃ§in deÄŸerler
    GALERI = {}

    # PLUGIN MESAJLARI AYARLIYORUZ
    PLUGIN_MESAJLAR = {}
    ORJ_PLUGIN_MESAJLAR = {"alive": "`TanrÄ± TÃ¼rk'Ã¼ Korusun. ðŸ�º Asena Ã§alÄ±ÅŸÄ±yor.`", "afk": f"`{str(choice(AFKSTR))}`", "kickme": "`GÃ¼le GÃ¼le ben gidiyorum `ðŸ¤ ", "pm": UNAPPROVED_MSG, "dÄ±zcÄ±": str(choice(DIZCILIK_STR)), "ban": "{mention}`, yasaklandÄ±!`", "mute": "{mention}`, sessize alÄ±ndÄ±!`", "approve": "{mention}`, bana mesaj gÃ¶nderebilirsin!`", "disapprove": "{mention}`, artÄ±k bana mesaj gÃ¶nderemezsin!`", "block": "{mention}`, engellendin!`"}

    PLUGIN_MESAJLAR_TURLER = ["alive", "afk", "kickme", "pm", "dÄ±zcÄ±", "ban", "mute", "approve", "disapprove", "block"]
    for mesaj in PLUGIN_MESAJLAR_TURLER:
        dmsj = MSJ_SQL.getir_mesaj(mesaj)
        if dmsj == False:
            PLUGIN_MESAJLAR[mesaj] = ORJ_PLUGIN_MESAJLAR[mesaj]
        else:
            if dmsj.startswith("MEDYA_"):
                medya = int(dmsj.split("MEDYA_")[1])
                medya = bot.get_messages(PLUGIN_CHANNEL_ID, ids=medya)

                PLUGIN_MESAJLAR[mesaj] = medya
            else:
                PLUGIN_MESAJLAR[mesaj] = dmsj
    if not PLUGIN_CHANNEL_ID == None:
        LOGS.info("Pluginler YÃ¼kleniyor")
        try:
            KanalId = bot.get_entity(PLUGIN_CHANNEL_ID)
        except:
            KanalId = "me"

        for plugin in bot.iter_messages(KanalId, filter=InputMessagesFilterDocument):
            if plugin.file.name and (len(plugin.file.name.split('.')) > 1) \
                and plugin.file.name.split('.')[-1] == 'py':
                Split = plugin.file.name.split('.')

                if not os.path.exists("./userbot/modules/" + plugin.file.name):
                    dosya = bot.download_media(plugin, "./userbot/modules/")
                else:
                    LOGS.info("Bu Plugin Zaten YÃ¼klÃ¼ " + plugin.file.name)
                    extractCommands('./userbot/modules/' + plugin.file.name)
                    dosya = plugin.file.name
                    continue 
                
                try:
                    spec = importlib.util.spec_from_file_location("userbot.modules." + Split[0], dosya)
                    mod = importlib.util.module_from_spec(spec)

                    spec.loader.exec_module(mod)
                except Exception as e:
                    LOGS.info(f"`YÃ¼kleme baÅŸarÄ±sÄ±z! Plugin hatalÄ±.\n\nHata: {e}`")

                    try:
                        plugin.delete()
                    except:
                        pass

                    if os.path.exists("./userbot/modules/" + plugin.file.name):
                        os.remove("./userbot/modules/" + plugin.file.name)
                    continue
                extractCommands('./userbot/modules/' + plugin.file.name)
    else:
        bot.send_message("me", f"`LÃ¼tfen pluginlerin kalÄ±cÄ± olmasÄ± iÃ§in PLUGIN_CHANNEL_ID'i ayarlayÄ±n.`")
except PhoneNumberInvalidError:
    print(INVALID_PH)
    exit(1)

async def FotoDegistir (foto):
    FOTOURL = GALERI_SQL.TUM_GALERI[foto].foto
    r = requests.get(FOTOURL)

    with open(str(foto) + ".jpg", 'wb') as f:
        f.write(r.content)    
    file = await bot.upload_file(str(foto) + ".jpg")
    try:
        await bot(functions.photos.UploadProfilePhotoRequest(
            file
        ))
        return True
    except:
        return False

for module_name in ALL_MODULES:
    imported_module = import_module("userbot.modules." + module_name)

LOGS.info("Botunuz Ã§alÄ±ÅŸÄ±yor! Herhangi bir sohbete .alive yazarak Test edin."
          " YardÄ±ma ihtiyacÄ±nÄ±z varsa, Destek grubumuza gelin t.me/AsenaSupport")
LOGS.info(f"Bot sÃ¼rÃ¼mÃ¼nÃ¼z: Asena {ASENA_VERSION}")

"""
if len(argv) not in (1, 3, 4):
    bot.disconnect()
else:
"""
bot.run_until_disconnected()