diff --git a/sedenbot/__init__.py b/sedenbot/__init__.py index cb66b7b..4ad385a 100644 --- a/sedenbot/__init__.py +++ b/sedenbot/__init__.py @@ -15,45 +15,39 @@ # """ UserBot hazırlanışı. """ -import os -import re - from sys import version_info +if version_info[0] < 3 or version_info[1] < 8: + LOGS.info("En az python 3.8 sürümüne sahip olmanız gerekir. " + "Birden fazla özellik buna bağlıdır. Bot kapatılıyor.") + quit(1) + +from os import environ +from re import compile as recomp +from re import search as resr + from logging import basicConfig, getLogger, INFO, DEBUG from distutils.util import strtobool as sb from math import ceil from pylast import LastFMNetwork, md5 from dotenv import load_dotenv -from requests import get from telethon.sync import TelegramClient, custom, events from telethon.sessions import StringSession -from telethon.utils import get_peer_id load_dotenv("config.env") # Bot günlükleri kurulumu: -CONSOLE_LOGGER_VERBOSE = sb(os.environ.get("CONSOLE_LOGGER_VERBOSE", "False")) +CONSOLE_LOGGER_VERBOSE = sb(environ.get("CONSOLE_LOGGER_VERBOSE", "False")) ASYNC_POOL = [] - -if CONSOLE_LOGGER_VERBOSE: - basicConfig( - format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", - level=DEBUG, - ) -else: - basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", - level=INFO) +basicConfig( + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", + level=DEBUG if CONSOLE_LOGGER_VERBOSE else INFO, +) LOGS = getLogger(__name__) -if version_info[0] < 3 or version_info[1] < 8: - LOGS.info("En az python 3.8 sürümüne sahip olmanız gerekir." - "Birden fazla özellik buna bağlıdır. Bot kapatılıyor.") - quit(1) - # Yapılandırmanın önceden kullanılan değişkeni kullanarak düzenlenip düzenlenmediğini kontrol edin. # Temel olarak, yapılandırma dosyası için kontrol. -CONFIG_CHECK = os.environ.get( +CONFIG_CHECK = environ.get( "___________LUTFEN_______BU_____SATIRI_____SILIN__________", None) if CONFIG_CHECK: @@ -63,80 +57,81 @@ quit(1) # Telegram API KEY ve HASH -API_KEY = os.environ.get("API_KEY", None) -API_HASH = os.environ.get("API_HASH", None) +API_KEY = environ.get("API_KEY", None) +API_HASH = environ.get("API_HASH", None) # UserBot Session String -STRING_SESSION = os.environ.get("STRING_SESSION", None) +STRING_SESSION = environ.get("STRING_SESSION", None) # Kanal / Grup ID yapılandırmasını günlüğe kaydetme. -BOTLOG_CHATID = int(os.environ.get("BOTLOG_CHATID", None)) +BOTLOG_CHATID = environ.get("BOTLOG_CHATID", None) +BOTLOG_CHATID = int(BOTLOG_CHATID) if BOTLOG_CHATID and resr('^-?\d+$', BOTLOG_CHATID) else None # Alive Mesajını değiştirme. -ALIVE_MESAJI = os.environ.get("ALIVE_MESAJI", "Merhaba Seden! Seni Seviyorum ❤️") +ALIVE_MESAJI = environ.get("ALIVE_MESAJI", "Merhaba Seden! Seni Seviyorum ❤️") # UserBot günlükleme özelliği. -BOTLOG = sb(os.environ.get("BOTLOG", "False")) -LOGSPAMMER = sb(os.environ.get("LOGSPAMMER", "False")) +BOTLOG = sb(environ.get("BOTLOG", "False")) +LOGSPAMMER = sb(environ.get("LOGSPAMMER", "False")) # Hey! Bu bir bot. Endişelenme ;) -PM_AUTO_BAN = sb(os.environ.get("PM_AUTO_BAN", "False")) +PM_AUTO_BAN = sb(environ.get("PM_AUTO_BAN", "False")) # Güncelleyici için Heroku hesap bilgileri. -HEROKU_APPNAME = os.environ.get("HEROKU_APPNAME", None) -HEROKU_APIKEY = os.environ.get("HEROKU_APIKEY", None) +HEROKU_APPNAME = environ.get("HEROKU_APPNAME", None) +HEROKU_APIKEY = environ.get("HEROKU_APIKEY", None) # Güncelleyici için özel (fork) repo linki. -UPSTREAM_REPO_URL = os.environ.get( +UPSTREAM_REPO_URL = environ.get( "UPSTREAM_REPO_URL", "https://github.com/TeamDerUntergang/Telegram-UserBot.git") # Ayrıntılı konsol günlügü -CONSOLE_LOGGER_VERBOSE = sb(os.environ.get("CONSOLE_LOGGER_VERBOSE", "False")) +CONSOLE_LOGGER_VERBOSE = sb(environ.get("CONSOLE_LOGGER_VERBOSE", "False")) # SQL Veritabanı -DB_URI = os.environ.get("DATABASE_URL", None) +DB_URI = environ.get("DATABASE_URL", None) # OCR API key -OCR_SPACE_API_KEY = os.environ.get("OCR_SPACE_API_KEY", None) +OCR_SPACE_API_KEY = environ.get("OCR_SPACE_API_KEY", None) # remove.bg API key -REM_BG_API_KEY = os.environ.get("REM_BG_API_KEY", None) +REM_BG_API_KEY = environ.get("REM_BG_API_KEY", None) # AUTO PP -AUTO_PP = os.environ.get("AUTO_PP", None) +AUTO_PP = environ.get("AUTO_PP", None) # Chrome sürücüsü ve Google Chrome dosyaları -CHROME_DRIVER = os.environ.get("CHROME_DRIVER", None) +CHROME_DRIVER = environ.get("CHROME_DRIVER", None) # Hava durumu varsayılan şehir -WEATHER_DEFCITY = os.environ.get("WEATHER_DEFCITY", None) +WEATHER_DEFCITY = environ.get("WEATHER_DEFCITY", None) # Lydia API -LYDIA_API_KEY = os.environ.get("LYDIA_API_KEY", None) +LYDIA_API_KEY = environ.get("LYDIA_API_KEY", None) # Anti Spambot -ANTI_SPAMBOT = sb(os.environ.get("ANTI_SPAMBOT", "False")) -ANTI_SPAMBOT_SHOUT = sb(os.environ.get("ANTI_SPAMBOT_SHOUT", "False")) +ANTI_SPAMBOT = sb(environ.get("ANTI_SPAMBOT", "False")) +ANTI_SPAMBOT_SHOUT = sb(environ.get("ANTI_SPAMBOT_SHOUT", "False")) # Youtube API key -YOUTUBE_API_KEY = os.environ.get("YOUTUBE_API_KEY", None) +YOUTUBE_API_KEY = environ.get("YOUTUBE_API_KEY", None) # Saat & Tarih - Ülke ve Saat Dilimi -COUNTRY = str(os.environ.get("COUNTRY", "")) -TZ_NUMBER = int(os.environ.get("TZ_NUMBER", 1)) +COUNTRY = str(environ.get("COUNTRY", "")) +TZ_NUMBER = int(environ.get("TZ_NUMBER", 3)) # Temiz Karşılama -CLEAN_WELCOME = sb(os.environ.get("CLEAN_WELCOME", "True")) +CLEAN_WELCOME = sb(environ.get("CLEAN_WELCOME", "True")) # Last.fm modülü -BIO_PREFIX = os.environ.get("BIO_PREFIX", None) -DEFAULT_BIO = os.environ.get("DEFAULT_BIO", None) +BIO_PREFIX = environ.get("BIO_PREFIX", None) +DEFAULT_BIO = environ.get("DEFAULT_BIO", None) -LASTFM_API = os.environ.get("LASTFM_API", None) -LASTFM_SECRET = os.environ.get("LASTFM_SECRET", None) -LASTFM_USERNAME = os.environ.get("LASTFM_USERNAME", None) -LASTFM_PASSWORD_PLAIN = os.environ.get("LASTFM_PASSWORD", None) +LASTFM_API = environ.get("LASTFM_API", None) +LASTFM_SECRET = environ.get("LASTFM_SECRET", None) +LASTFM_USERNAME = environ.get("LASTFM_USERNAME", None) +LASTFM_PASSWORD_PLAIN = environ.get("LASTFM_PASSWORD", None) LASTFM_PASS = md5(LASTFM_PASSWORD_PLAIN) if LASTFM_API and LASTFM_SECRET and LASTFM_USERNAME and LASTFM_PASS: lastfm = LastFMNetwork(api_key=LASTFM_API, @@ -147,22 +142,22 @@ lastfm = None # Google Drive Modülü -G_DRIVE_CLIENT_ID = os.environ.get("G_DRIVE_CLIENT_ID", None) -G_DRIVE_CLIENT_SECRET = os.environ.get("G_DRIVE_CLIENT_SECRET", None) -G_DRIVE_AUTH_TOKEN_DATA = os.environ.get("G_DRIVE_AUTH_TOKEN_DATA", None) -GDRIVE_FOLDER_ID = os.environ.get("GDRIVE_FOLDER_ID", None) -TEMP_DOWNLOAD_DIRECTORY = os.environ.get("TMP_DOWNLOAD_DIRECTORY", +G_DRIVE_CLIENT_ID = environ.get("G_DRIVE_CLIENT_ID", None) +G_DRIVE_CLIENT_SECRET = environ.get("G_DRIVE_CLIENT_SECRET", None) +G_DRIVE_AUTH_TOKEN_DATA = environ.get("G_DRIVE_AUTH_TOKEN_DATA", None) +GDRIVE_FOLDER_ID = environ.get("GDRIVE_FOLDER_ID", None) +TEMP_DOWNLOAD_DIRECTORY = environ.get("TMP_DOWNLOAD_DIRECTORY", "./downloads") # Inline bot çalışması için -BOT_TOKEN = os.environ.get("BOT_TOKEN", None) -BOT_USERNAME = os.environ.get("BOT_USERNAME", None) +BOT_TOKEN = environ.get("BOT_TOKEN", None) +BOT_USERNAME = environ.get("BOT_USERNAME", None) # Genius modülünün çalışması için buradan değeri alın https://genius.com/developers her ikisi de aynı değerlere sahiptir -GENIUS_API_TOKEN = os.environ.get("GENIUS_API_TOKEN", None) +GENIUS_API_TOKEN = environ.get("GENIUS_API_TOKEN", None) # Ayarlanabilir PM izin verilmedi mesajı -PM_UNAPPROVED = os.environ.get("PM_UNAPPROVED", None) +PM_UNAPPROVED = environ.get("PM_UNAPPROVED", None) CMD_HELP = {} @@ -171,12 +166,7 @@ """ # 'bot' değişkeni -if STRING_SESSION: - # pylint: devre dışı=geçersiz ad - bot = TelegramClient(StringSession(STRING_SESSION), API_KEY, API_HASH) -else: - # pylint: devre dışı=geçersiz ad - bot = TelegramClient("sedenbot", API_KEY, API_HASH) +bot = TelegramClient(StringSession(STRING_SESSION if STRING_SESSION else "sedenbot"), API_KEY, API_HASH) async def check_botlog_chatid(): if not BOTLOG_CHATID and LOGSPAMMER: @@ -247,9 +237,9 @@ def paginate_help(page_number, loaded_modules, prefix): modulo_page = page_number % max_num_pages if len(pairs) > number_of_rows: pairs = pairs[modulo_page * number_of_rows:number_of_rows * (modulo_page + 1)] + \ - [ - (custom.Button.inline("⬅️Geri", data="{}_prev({})".format(prefix, modulo_page)), - custom.Button.inline("İleri➡️", data="{}_next({})".format(prefix, modulo_page))) + [ + (custom.Button.inline("⬅️ Geri", data=f"{prefix}_prev({modulo_page})"), + custom.Button.inline("İleri ➡️", data=f"{prefix}_next({modulo_page})")) ] return pairs @@ -287,7 +277,7 @@ async def inline_handler(event): text="""@SedenUserBot'u kullanmayı deneyin! Hesabınızı bot'a çevirebilirsiniz ve bunları kullanabilirsiniz. Unutmayın, siz başkasının botunu yönetemezsiniz! Alttaki GitHub adresinden tüm kurulum detayları anlatılmıştır.""", buttons=[ - [custom.Button.url("Kanala Katıl", "https://t.me/SedenUserBot"), custom.Button.url( + [custom.Button.url("Kanala Katıl", "https://t.me/SedenUserBot"), custom.custom.Button.url( "Gruba Katıl", "https://t.me/SedenUserBotSupport")], [custom.Button.url( "GitHub", "https://github.com/TeamDerUntergang/Telegram-UserBot")] @@ -297,7 +287,7 @@ async def inline_handler(event): await event.answer([result] if result else None) @tgbot.on(events.callbackquery.CallbackQuery( # pylint:disable=E0602 - data=re.compile(b"helpme_next\((.+?)\)") + data=recomp(b"helpme_next\((.+?)\)") )) async def on_plug_in_callback_query_handler(event): if event.query.user_id == uid: # pylint:disable=E0602 @@ -312,7 +302,7 @@ async def on_plug_in_callback_query_handler(event): await event.answer(reply_pop_up_alert, cache_time=0, alert=True) @tgbot.on(events.callbackquery.CallbackQuery( # pylint:disable=E0602 - data=re.compile(b"helpme_prev\((.+?)\)") + data=recomp(b"helpme_prev\((.+?)\)") )) async def on_plug_in_callback_query_handler(event): if event.query.user_id == uid: # pylint:disable=E0602 @@ -330,7 +320,7 @@ async def on_plug_in_callback_query_handler(event): await event.answer(reply_pop_up_alert, cache_time=0, alert=True) @tgbot.on(events.callbackquery.CallbackQuery( # pylint:disable=E0602 - data=re.compile(b"ub_modul_(.*)") + data=recomp(b"ub_modul_(.*)") )) async def on_plug_in_callback_query_handler(event): if event.query.user_id == uid: # pylint:disable=E0602 diff --git a/sedenbot/moduller/android.py b/sedenbot/moduller/android.py index 982dd14..febb37f 100644 --- a/sedenbot/moduller/android.py +++ b/sedenbot/moduller/android.py @@ -16,11 +16,12 @@ """ Android ile ilgili komutları içeren UserBot modülü """ -import re +from re import sub import json from requests import get from bs4 import BeautifulSoup +from urllib.parse import urlencode from sedenbot import CMD_HELP from sedenbot.events import extract_args, extract_args_arr, sedenify @@ -77,11 +78,13 @@ async def device_info(request): async def codename_info(request): """ Cihazın kod adını bulmak için arama yapın """ textx = await request.get_reply_message() - arr = extract_args_arr(request) - brand = arr[0].lower() - device = arr[1].lower() - if brand and device: - pass + arr = extract_args(request) + brand = arr + device = arr + if " " in arr: + args = arr.split(' ', 1) + brand = args[0].lower() + device = args[1].lower() elif textx: brand = textx.text.split(' ')[0] device = ' '.join(textx.text.split(' ')[1:]) @@ -92,71 +95,132 @@ async def codename_info(request): "certified-android-devices/master/by_brand.json").text) devices_lower = {k.lower():v for k,v in data.items()} # Lower brand names in JSON devices = devices_lower.get(brand) - results = [i for i in devices if i["name"].lower() == device.lower() or i["model"].lower() == device.lower()] - if results: - reply = f"**{brand} {device} için arama sonuçları**:\n\n" - if len(results) > 8: - results = results[:8] - for item in results: - reply += f"**Kod Adı**: {item['device']}\n" \ - f"**İsim**: {item['name']}\n" \ - f"**Model**: {item['model']}\n\n" - else: + if not devices: reply = f"`{device} bulunamadı`\n" + else: + results = [i for i in devices if device.lower() in i["name"].lower() or device.lower() in i["model"].lower()] + if results: + reply = f"**{brand} {device} için arama sonuçları**:\n\n" + if len(results) > 8: + results = results[:8] + for item in results: + reply += f"**Kod Adı**: {item['device']}\n" \ + f"**İsim**: {item['name']}\n" \ + f"**Model**: {item['model']}\n\n" + else: + reply = f"`{device} bulunamadı`\n" await request.edit(reply) + +# @frknkrc44 tarafından baştan yazılmıştır @sedenify(outgoing=True, pattern=r"^.specs") -async def devices_specifications(request): - """ Mobil cihaz özellikleri """ - textx = await request.get_reply_message() - arr = extract_args_arr(request) - brand = arr[0].lower() - device = arr[1].lower() - if brand and device: - pass - elif textx: - brand = textx.text.split(' ')[0] - device = ' '.join(textx.text.split(' ')[1:]) - else: - await request.edit("`Kullanım: .specs `") +async def specs(event): + args = extract_args(event) + if len(args) < 1: + await event.edit('`Kullanım: .specs `') return - all_brands = BeautifulSoup( - get('https://www.devicespecifications.com/tr/brand-more').content, - 'html.parser').find('div', { - 'class': 'brand-listing-container-news' - }).findAll('a') - brand_page_url = None - try: - brand_page_url = [ - i['href'] for i in all_brands if brand == i.text.strip().lower() - ][0] - except IndexError: - await request.edit(f'`{brand} bilinmeyen marka!`') - devices = BeautifulSoup(get(brand_page_url).content, 'html.parser') \ - .findAll('div', {'class': 'model-listing-container-80'}) - device_page_url = None - try: - device_page_url = [ - i.a['href'] - for i in BeautifulSoup(str(devices), 'html.parser').findAll('h3') - if device in i.text.strip().lower() - ] - except IndexError: - await request.edit(f"`{device} bulunamadı!`") - if len(device_page_url) > 2: - device_page_url = device_page_url[:2] - reply = '' - for url in device_page_url: - info = BeautifulSoup(get(url).content, 'html.parser') - reply = '\n**' + info.title.text.split('-')[0].strip() + '**\n\n' - info = info.find('div', {'id': 'model-brief-specifications'}) - specifications = re.findall(r'.*?
', str(info)) - for item in specifications: - title = re.findall(r'(.*?)', item)[0].strip() - data = re.findall(r'
: (.*?)
', item)[0]\ - .replace('', '').replace('', '').strip() - reply += f'**{title}**: {data}\n' - await request.edit(reply) + + link = find_device(args) + + if not link: + await event.edit('`Bu cihaza dair bir bilgi bulunamadı veya ' + 'çok fazla istek attınız.`') + return + + req = get(link) + soup = BeautifulSoup(req.text, features='html.parser') + + def get_spec(query, key='data-spec', cls='td'): + try: + result = soup.find(cls,{key:query.split()}).text.strip() + result = "Bilgi alınamadı" if len(result) < 1 else result + return result + except: + return "Bilgi alınamadı" + + title = get_spec('specs-phone-name-title', 'class', 'h1') + launch = get_spec('released-hl', cls='span') + body = sub(', ','g, ', get_spec('body-hl', cls='span')) + os = get_spec('os-hl', cls='span') + storage = get_spec('internalmemory') + stortyp = get_spec('memoryother') + dispsize = get_spec('displaysize-hl', cls='span') + dispres = get_spec('displayres-hl', cls='div') + bcampx = get_spec('cam1modules') + bcamft = get_spec('cam1features') + bcamvd = get_spec('cam1video') + fcampx = get_spec('cam2modules') + fcamft = get_spec('cam2features') + fcamvd = get_spec('cam2video') + cpuname = get_spec('chipset') + cpuchip = get_spec('cpu') + gpuname = get_spec('gpu') + battery = get_spec('batdescription1') + wlan = get_spec('wlan') + bluetooth = get_spec('bluetooth') + gps = get_spec('gps') + usb = get_spec('usb') + sensors = get_spec('sensors') + sarus = sub('\s\s+',', ',get_spec('sar-us')) + sareu = sub('\s\s+',', ',get_spec('sar-eu')) + + await event.edit(f'**{title}**\n\n' + f'**Çıkış tarihi:** `{launch}\n`' + f'**Ağırlık ve kalınlık:** `{body}`\n' + f'**SAR değeri (ABD):** `{sarus}`\n' + f'**SAR değeri (Avr):** `{sareu}`\n' + f'**İşletim sistemi:** `{os}`\n' + f'**İşlemci:** `{cpuname}`\n' + f'**İşlemci çekirdekleri:** `{cpuchip}`\n' + f'**Grafik işlemci:** `{gpuname}`\n' + f'**Bellek:** `{storage}\n`' + f'**Bellek tipi:** `{stortyp}`\n' + f'**Ekran boyutu:** `{dispsize}`\n' + f'**Ekran çözünürlüğü:** `{dispres}`\n' + f'**Arka kamera(lar):**\n`{bcampx}`\n' + f'**Arka kamera özellikleri:** `{bcamft}`\n' + f'**Arka kamera video kaydı:** `{bcamvd}`\n' + f'**Ön kamera(lar):**\n`{fcampx}`\n' + f'**Ön kamera özellikleri:** `{fcamft}`\n' + f'**Ön kamera video kaydı:** `{fcamvd}`\n' + f'**Pil:** `{battery}`\n' + f'**Kablosuz:** `{wlan}`\n' + f'**Bluetooth:** `{bluetooth}`\n' + f'**GPS:** `{gps}`\n' + f'**Sensörler:** `{sensors}`\n' + f'\nDaha fazlası için: {link}') + + +# @frknkrc44, GSMArena üzerinden cihaz bulma +def find_device(query): + raw_query = query.lower() + + def replace_query(query): + return urlencode({'sSearch':query}) + + query = replace_query(raw_query) + req = get(f"https://www.gsmarena.com/res.php3?{query}", + {'User-Agent':'Mozilla/5.0 (compatible; Googlebot/2.1; ' + '+http://www.google.com/bot.html)'}) + soup = BeautifulSoup(req.text, features='html.parser') + + if 'Too' in soup.find('title').text: # GSMArena geçici ban atarsa + return None + + res = soup.findAll('div',{'class':['makers']}) + + if not res or len(res) < 1: # hiçbir cihaz bulunamazsa + return None + + res = res[0].findAll('li') + + for item in res: + name = str(item.find('span')) + name = sub('(<|','',name) + if name[name.find('>')+1:].lower() == raw_query or sub('|/>)',' ', name).lower() == raw_query: + link = f"https://www.gsmarena.com/{item.find('a')['href']}" + return link + return None @sedenify(outgoing=True, pattern=r"^.twrp") async def twrp(request): diff --git a/sedenbot/moduller/evaluators.py b/sedenbot/moduller/evaluators.py index dc67a15..791fe11 100644 --- a/sedenbot/moduller/evaluators.py +++ b/sedenbot/moduller/evaluators.py @@ -16,7 +16,8 @@ """ Telegram'dan kod ve terminal komutlarını yürütmek için UserBot modülü. """ -import asyncio +from asyncio import create_subprocess_shell +from asyncio.subprocess import PIPE from getpass import getuser from os import remove @@ -24,26 +25,19 @@ from sedenbot import CMD_HELP, BOTLOG, BOTLOG_CHATID from sedenbot.events import extract_args, sedenify +import ast +import operator as op @sedenify(outgoing=True, pattern="^.eval") async def evaluate(query): """ .eval komutu verilen Python ifadesini değerlendirir. """ - if query.is_channel and not query.is_group: - await query.edit("`Eval komutlarına kanallarda izin verilmiyor`") - return args = extract_args(query) - if len(args) > 1: - expression = args - else: + if len(args) < 1: await query.edit("``` Değerlendirmek için bir ifade verin. ```") return - if expression in ("userbot.session", "config.env"): - await query.edit("`Bu tehlikeli bir operasyon! İzin verilemedi!`") - return - try: - evaluation = str(eval(expression)) + evaluation = safe_eval(args) if evaluation: if isinstance(evaluation, str): if len(evaluation) >= 4096: @@ -59,88 +53,24 @@ async def evaluate(query): remove("output.txt") return await query.edit("**Sorgu: **\n`" - f"{expression}" + f"{args}" "`\n**Sonuç: **\n`" f"{evaluation}" "`") else: await query.edit("**Sorgu: **\n`" - f"{expression}" + f"{args}" "`\n**Sonuç: **\n`Sonuç döndürülemedi / Yanlış`") except Exception as err: await query.edit("**Sorgu: **\n`" - f"{expression}" + f"{args}" "`\n**İstisna: **\n" f"`{err}`") if BOTLOG: await query.client.send_message( BOTLOG_CHATID, - f"Eval sorgusu {expression} başarıyla yürütüldü") - -@sedenify(outgoing=True, pattern=r"^.exec") -async def run(run_q): - """ .exec komutu dinamik olarak oluşturulan programı yürütür """ - if run_q.is_channel and not run_q.is_group: - await run_q.edit("`Exec komutlarına kanallarda izin verilmiyor`") - return - - code = extract_args(run_q) - - if len(code) < 1: - await run_q.edit("``` Yürütmek için en az bir değişken gereklidir \ -.seden exec kullanarak örnek alabilirsiniz.```") - return - - if code in ("userbot.session", "config.env"): - await run_q.edit("`Bu tehlikeli bir operasyon! İzin verilemedi!`") - return - - if len(code.splitlines()) <= 5: - codepre = code - else: - clines = code.splitlines() - codepre = clines[0] + "\n" + clines[1] + "\n" + clines[2] + \ - "\n" + clines[3] + "..." - - command = "".join(f"\n {l}" for l in code.split("\n.strip()")) - process = await asyncio.create_subprocess_exec( - executable, - '-c', - command.strip(), - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE) - stdout, stderr = await process.communicate() - result = str(stdout.decode().strip()) \ - + str(stderr.decode().strip()) - - if result: - if len(result) > 4096: - file = open("output.txt", "w+") - file.write(result) - file.close() - await run_q.client.send_file( - run_q.chat_id, - "output.txt", - reply_to=run_q.id, - caption="`Çıktı çok büyük, dosya olarak gönderiliyor`", - ) - remove("output.txt") - return - await run_q.edit("**Sorgu: **\n`" - f"{codepre}" - "`\n**Sonuç: **\n`" - f"{result}" - "`") - else: - await run_q.edit("**Sorgu: **\n`" - f"{codepre}" - "`\n**Sonuç: **\n`Sonuç döndürülemedi / Yanlış`") - - if BOTLOG: - await run_q.client.send_message( - BOTLOG_CHATID, - "Exec sorgusu " + codepre + " başarıyla yürütüldü") + f"Eval sorgusu {args} başarıyla yürütüldü") @sedenify(outgoing=True, pattern="^.term") async def terminal_runner(term): @@ -162,14 +92,14 @@ async def terminal_runner(term): örneğe bakabilirsin.```") return - if command in ("userbot.session", "config.env"): + if command in ("sedenbot.session", "config.env"): await term.edit("`Bu tehlikeli bir operasyon! İzin verilemedi!`") return - process = await asyncio.create_subprocess_shell( + process = await create_subprocess_shell( command, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE) + stdout=PIPE, + stderr=PIPE) stdout, stderr = await process.communicate() result = str(stdout.decode().strip()) \ + str(stderr.decode().strip()) @@ -198,8 +128,24 @@ async def terminal_runner(term): "Terminal Komutu " + command + " başarıyla yürütüldü", ) +operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul, + ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor, + ast.USub: op.neg} + +def safe_eval(expr): + expr = expr.lower().replace("x","*").replace(" ","") + return str(_eval(ast.parse(expr, mode='eval').body)) + +def _eval(node): + if isinstance(node, ast.Num): + return node.n + elif isinstance(node, ast.BinOp): + return operators[type(node.op)](_eval(node.left), _eval(node.right)) + elif isinstance(node, ast.UnaryOp): + return operators[type(node.op)](_eval(node.operand)) + else: + raise TypeError("Bu güvenli bir eval sorgusu olmayabilir.") + CMD_HELP.update({"eval": ".eval 2 + 3\nKullanım: Mini ifadeleri değerlendirin."}) -CMD_HELP.update( - {"exec": ".exec print('merhaba')\nKullanım: Küçük python komutları yürütün."}) CMD_HELP.update( {"term": ".term ls\nKullanım: Sunucunuzda bash komutlarını ve komut dosyalarını çalıştırın."}) diff --git a/sedenbot/moduller/filter.py b/sedenbot/moduller/filter.py index 9457496..859eda6 100644 --- a/sedenbot/moduller/filter.py +++ b/sedenbot/moduller/filter.py @@ -29,7 +29,6 @@ async def filter_incoming_handler(handler): try: from sedenbot.moduller.sql_helper.filter_sql import get_filters except: - await handler.edit("`Bot Non-SQL modunda çalışıyor!!`") return name = handler.raw_text filters = get_filters(handler.chat_id) @@ -44,7 +43,7 @@ async def filter_incoming_handler(handler): elif pro and trigger.reply: await handler.reply(trigger.reply) -@sedenify(outgoing=True, pattern="^.filter") +@sedenify(outgoing=True, pattern="^.addfilter") async def add_new_filter(new_handler): """ .filter komutu bir sohbete yeni filtreler eklemeye izin verir """ try: @@ -52,38 +51,43 @@ async def add_new_filter(new_handler): except: await new_handler.edit("`Bot Non-SQL modunda çalışıyor!!`") return - arr = extract_args(new_handler).split(' ', 1) - if len(arr) < 2: + args = extract_args(new_handler) + if len(args) < 1: await new_handler.edit("`Komut kullanımı hatalı.`") return + arr = args.split(' ', 1) keyword = arr[0] - string = arr[1] + string = None if len(arr) < 2 else arr[1] msg = await new_handler.get_reply_message() msg_id = None - if msg and msg.media and not string: - if BOTLOG_CHATID: - await new_handler.client.send_message( - BOTLOG_CHATID, f"#FILTER\ - \nGrup ID: {new_handler.chat_id}\ - \nFiltre: {keyword}\ - \n\nBu mesaj filtrenin cevaplanması için kaydedildi, lütfen bu mesajı silmeyin!" - ) - msg_o = await new_handler.client.forward_messages( - entity=BOTLOG_CHATID, - messages=msg, - from_peer=new_handler.chat_id, - silent=True) - msg_id = msg_o.id + if msg: + if msg.media: + if BOTLOG_CHATID: + await new_handler.client.send_message( + BOTLOG_CHATID, f"#FILTER\ + \nGrup ID: {new_handler.chat_id}\ + \nFiltre: {keyword}\ + \n\nBu mesaj filtrenin cevaplanması için kaydedildi, lütfen bu mesajı silmeyin!" + ) + msg_o = await new_handler.client.forward_messages( + entity=BOTLOG_CHATID, + messages=msg, + from_peer=new_handler.chat_id, + silent=True) + msg_id = msg_o.id + else: + await new_handler.edit( + "`Bir medyanın filtreye karşılık olarak kaydedilebilmesi için BOTLOG_CHATID değerinin ayarlanması gerekli.`" + ) + return else: - await new_handler.edit( - "`Bir medyanın filtreye karşılık olarak kaydedilebilmesi için BOTLOG_CHATID değerinin ayarlanması gerekli.`" - ) - return - elif new_handler.reply_to_msg_id and not string: - rep_msg = await new_handler.get_reply_message() - string = rep_msg.text + rep_msg = await new_handler.get_reply_message() + string = rep_msg.text + elif not string: + await new_handler.edit("`Komut kullanımı hatalı.`") + return success = " **{}** `filtresi {}`" - if add_filter(str(new_handler.chat_id), keyword, string, msg_id) is True: + if add_filter(str(new_handler.chat_id), keyword, string, msg_id): await new_handler.edit(success.format(keyword, 'eklendi')) else: await new_handler.edit(success.format(keyword, 'güncellendi')) @@ -107,7 +111,6 @@ async def remove_a_filter(r_handler): async def kick_marie_filter(event): """ .rmfilters komutu Marie'de (ya da onun tabanındaki botlarda) \ kayıtlı olan notları silmeye yarar. """ - cmd = event.text[0] bot_type = extract_args(event).lower() if bot_type not in ["marie", "rose"]: await event.edit("`Bu bot henüz desteklenmiyor.`") @@ -155,7 +158,7 @@ async def filters_active(event): "filter": ".filters\ \nKullanım: Bir sohbetteki tüm userbot filtrelerini listeler.\ - \n\n.filter ya da bir mesajı .filter \ + \n\n.addfilter ya da bir mesajı .filter \ \nKullanım: 'filtrelenecek kelime' olarak istenilen şeyi kaydeder.\ \nBot her 'filtrelenecek kelime' yi algıladığında o mesaja cevap verecektir.\ \nDosyalardan çıkartmalara her türlü şeyle çalışır.\ diff --git a/sedenbot/moduller/rextester/api.py b/sedenbot/moduller/rextester/api.py index 8d3c307..c04ca17 100644 --- a/sedenbot/moduller/rextester/api.py +++ b/sedenbot/moduller/rextester/api.py @@ -1,6 +1,6 @@ import aiohttp -from userbot.modules.rextester.langs import languages +from sedenbot.moduller.rextester.langs import languages class Rextester(object): diff --git a/sedenbot/moduller/stickers.py b/sedenbot/moduller/stickers.py index 4061007..9cb48d4 100644 --- a/sedenbot/moduller/stickers.py +++ b/sedenbot/moduller/stickers.py @@ -16,19 +16,18 @@ """ Çıkartma oluşturmak ya da çalmak için yapılmış UserBot modülüdür. Teşekkürler @rupansh """ -import io -import math -import random -import urllib.request +from io import BytesIO +from math import floor +from random import choice +from urllib.request import urlopen, Request from os import remove from PIL import Image from telethon.tl.types import DocumentAttributeFilename, MessageMediaPhoto from telethon.tl.functions.messages import GetStickerSetRequest -from telethon.tl.types import InputStickerSetID -from telethon.tl.types import DocumentAttributeSticker +from telethon.tl.types import InputStickerSetID, DocumentAttributeSticker -from sedenbot import bot, CMD_HELP +from sedenbot import bot, CMD_HELP, me from sedenbot.events import sedenify DIZCILIK_STR = [ @@ -36,18 +35,20 @@ "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..", + "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... ", + "Sonunda Ecem'in seveceği bir çıkartma dızlıyorum...", + "Ecem, bu dız senin için...", ] @sedenify(outgoing=True, pattern="^.(d[ıi]zla|kang)") async def dizla(args): - """ .kang komutu çıkartmaları başka paketten alır ya da yeni bir çıkartma oluşturur. """ - user = await bot.get_me() + """ .dızla komutu çıkartmaları başka paketten alır ya da yeni bir çıkartma oluşturur. """ + user = me if not user.username: user.username = user.first_name message = await args.get_reply_message() @@ -58,19 +59,16 @@ async def dizla(args): if message and message.media: if isinstance(message.media, MessageMediaPhoto): - await args.edit(f"`{random.choice(DIZCILIK_STR)}`") - photo = io.BytesIO() + photo = BytesIO() photo = await bot.download_media(message.photo, photo) elif "image" in message.media.document.mime_type.split('/'): - await args.edit(f"`{random.choice(DIZCILIK_STR)}`") - photo = io.BytesIO() + photo = BytesIO() await bot.download_file(message.media.document, photo) if (DocumentAttributeFilename(file_name='sticker.webp') in message.media.document.attributes): emoji = message.media.document.attributes[1].alt emojibypass = True elif "tgsticker" in message.media.document.mime_type: - await args.edit(f"`{random.choice(DIZCILIK_STR)}`") await bot.download_file(message.media.document, 'AnimatedSticker.tgs') @@ -85,6 +83,7 @@ async def dizla(args): else: await args.edit("`Desteklenmeyen dosya!`") return + await args.edit(f"`{choice(DIZCILIK_STR)}`") else: await args.edit("`Bunu dızlayamam...`") return @@ -108,7 +107,7 @@ async def dizla(args): packname = f"a{user.id}_by_{user.username}_{pack}" packnick = f"@{user.username}'s UserBot pack {pack}" cmd = '/newpack' - file = io.BytesIO() + file = BytesIO() if not is_anim: image = await resize_photo(photo) @@ -119,8 +118,7 @@ async def dizla(args): packnick += " (Animasyonlu)" cmd = '/newanimated' - response = urllib.request.urlopen( - urllib.request.Request(f'http://t.me/addstickers/{packname}')) + response = urlopen(Request(f'http://t.me/addstickers/{packname}')) htmlstr = response.read().decode("utf8").split('\n') if " A Telegram user has created the Sticker Set." not in htmlstr: @@ -266,8 +264,8 @@ async def resize_photo(photo): scale = 512 / size2 size1new = size1 * scale size2new = 512 - size1new = math.floor(size1new) - size2new = math.floor(size2new) + size1new = floor(size1new) + size2new = floor(size2new) sizenew = (size1new, size2new) image = image.resize(sizenew) else: @@ -275,6 +273,45 @@ async def resize_photo(photo): return image + +@sedenify(outgoing=True, pattern='^.getsticker$') +async def getsticker(event): + reply = await event.get_reply_message() + if not reply: + await event.edit('`Lütfen bir mesaj alıntılayın.`') + return + + if not (reply.media and + DocumentAttributeFilename(file_name='sticker.webp') + in reply.media.document.attributes): + await event.edit('`Bu bir çıkartma olmayabilir.`') + return + + photo = BytesIO() + await bot.download_file(reply.media.document, photo) + photo.name = f'sedenbot_{reply.media.document.id}.png' + photo.seek(0) + + await event.client.send_file(event.chat_id, photo, force_document=True) + await event.delete() + + +@sedenify(outgoing=True, pattern='^.stickerid$') +async def getstickerid(event): + reply = await event.get_reply_message() + if not reply: + await event.edit('`Lütfen bir mesaj alıntılayın.`') + return + + if not (reply.media and ( + DocumentAttributeFilename(file_name='sticker.webp') + in reply.media.document.attributes or + "tgsticker" in reply.media.document.mime_type)): + await event.edit('`Bu bir çıkartma olmayabilir.`') + return + + await event.edit(f'**Çıkartma ID:** `{reply.media.document.id}`') + @sedenify(outgoing=True, pattern="^.packinfo") async def dizbilgisi(event): if not event.is_reply: @@ -319,14 +356,18 @@ async def dizbilgisi(event): CMD_HELP.update({ "stickers": - ".kang\ -\nKullanım: .kang ile bir çıkartmaya ya da resme yanıtlayarak kendi çıkartma paketinize çıkartma olarak ekleyebilirsiniz.\ -\n\n.kang [emoji(ler)]\ -\nKullanım: .kang gibi çalışır fakat istediğiniz emojiyi çıkartmanın emojisi olarak belirtir.\ -\n\n.kang [numara]\ + ".dızla\ +\nKullanım: .dızla ile bir çıkartmaya ya da resme yanıtlayarak kendi çıkartma paketinize çıkartma olarak ekleyebilirsiniz.\ +\n\n.dızla [emoji(ler)]\ +\nKullanım: .dızla gibi çalışır fakat istediğiniz emojiyi çıkartmanın emojisi olarak belirtir.\ +\n\n.dızla [numara]\ \nKullanım: Çıkartmayı ya da resmi belirtilen pakete ekler fakat emoji olarak şu kullanılır: 🤔 \ -\n\n.kang [emoji(ler)] [numara]\ +\n\n.dızla [emoji(ler)] [numara]\ \nKullanım: Çıkartmayı ya da resmi belirtilen pakete ekler ve belirttiğiniz emoji çıkartmanın emojisi olarak kullanılır.\ +\n\n.getsticker\ +\nKullanım: Yanıtlanan çıkartmayı png dosya biçiminde gönderir.\ +\n\n.stickerid\ +\nKullanım: Yanıtlanan çıkartmanın ID numarasını verir.\ \n\n.packinfo\ \nKullanım: Çıkartma paketi hakkında bilgi verir." }) diff --git a/sedenbot/moduller/system.py b/sedenbot/moduller/system.py index 313dad9..5bd7c0f 100644 --- a/sedenbot/moduller/system.py +++ b/sedenbot/moduller/system.py @@ -72,7 +72,7 @@ async def bot_ver(event): + str(stderr.decode().strip()) await event.edit("[Seden UserBot](https://telegram.dog/SedenUserBot) `Versiyonu: " - f"{verout} v3.3" + f"{verout} v3.4" "` \n" "`Toplam değişiklik: " f"{revout}" diff --git a/sedenbot/seden_main.py b/sedenbot/seden_main.py index 0ae86a7..0baf215 100644 --- a/sedenbot/seden_main.py +++ b/sedenbot/seden_main.py @@ -78,6 +78,6 @@ async def load_bl(): LOGS.info("Botunuz çalışıyor! Herhangi bir sohbete .alive yazarak Test edin." " Yardıma ihtiyacınız varsa, Destek grubumuza gelin https://telegram.me/SedenUserBotSupport") -LOGS.info("Bot sürümünüz Seden v3.3") +LOGS.info("Bot sürümünüz Seden v3.4") bot.run_until_disconnected()