mirror of
https://github.com/yasirarism/MissKatyPyro.git
synced 2026-01-05 19:44:51 +00:00
Some Improvement (#47)
This commit is contained in:
parent
58d093b51e
commit
63e76023e0
18 changed files with 189 additions and 103 deletions
30
README.md
30
README.md
|
|
@ -4,13 +4,13 @@
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
## NOTES
|
## NOTES
|
||||||
This repo has many bugs and i dont have time to fix it. If you can help me, please open pull request (PR).
|
This repo has some small bugs and i dont have time to fix it. If you can help me, please open pull request (PR).
|
||||||
|
|
||||||
## Demo
|
## Demo
|
||||||
You can check demo this repo in this bot [MissKatyPyro](https://t.me/MissKatyRoBot)
|
You can check demo this repo in this bot [MissKatyPyro](https://t.me/MissKatyRoBot)
|
||||||
|
|
||||||
## Features and Give Support
|
## Features and Give Support
|
||||||
* Please open this web https://yasirpedia.eu.org/ to check some feature or give support to me.
|
* Please open this web https://yasirpedia.eu.org/ to know about me or support me.
|
||||||
|
|
||||||
## Variables
|
## Variables
|
||||||
|
|
||||||
|
|
@ -23,9 +23,9 @@ You can check demo this repo in this bot [MissKatyPyro](https://t.me/MissKatyRoB
|
||||||
* `LOG_CHANNEL` : A channel to log the activities of bot. Make sure bot is an admin in the channel.
|
* `LOG_CHANNEL` : A channel to log the activities of bot. Make sure bot is an admin in the channel.
|
||||||
* `USER_SESSION` : Session string for Userbot.
|
* `USER_SESSION` : Session string for Userbot.
|
||||||
### Optional Variables
|
### Optional Variables
|
||||||
Check by yourself for optional vars.
|
Check by yourself in config files.
|
||||||
|
|
||||||
## Deploy (Must Use Docker to Run This Bot)
|
## Deploy (Must Use Docker to Run This Bot, since i had make it built in all requirements)
|
||||||
|
|
||||||
- Start Docker daemon (Skip if already running):
|
- Start Docker daemon (Skip if already running):
|
||||||
```
|
```
|
||||||
|
|
@ -43,8 +43,28 @@ sudo docker run misskaty
|
||||||
```
|
```
|
||||||
sudo docker ps
|
sudo docker ps
|
||||||
```
|
```
|
||||||
|
sudo docker stop <pid>
|
||||||
|
|
||||||
|
#### Build And Run The Docker Image Using docker-compose
|
||||||
|
|
||||||
|
- Install docker-compose
|
||||||
```
|
```
|
||||||
sudo docker stop id
|
sudo apt install docker-compose
|
||||||
|
```
|
||||||
|
- Build and run Docker image or to view current running image:
|
||||||
|
```
|
||||||
|
sudo docker-compose up
|
||||||
|
```
|
||||||
|
- After editing files with nano for example (nano start.sh):
|
||||||
|
```
|
||||||
|
sudo docker-compose up --build
|
||||||
|
```
|
||||||
|
- To stop the running image:
|
||||||
|
```
|
||||||
|
sudo docker ps
|
||||||
|
```
|
||||||
|
```
|
||||||
|
sudo docker-compose stop <pid>
|
||||||
```
|
```
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,11 @@
|
||||||
|
ADMINS=617426792
|
||||||
API_HASH=
|
API_HASH=
|
||||||
DATABASE_NAME=
|
|
||||||
API_ID=
|
API_ID=
|
||||||
SUPPORT_CHAT=YasirPediaChannel
|
|
||||||
DATABASE_URI=mongodb+srv://
|
|
||||||
BOT_TOKEN=
|
BOT_TOKEN=
|
||||||
LOG_CHANNEL=-100
|
DATABASE_NAME=MissKatyPyro
|
||||||
|
DATABASE_URI=mongodb+srv://
|
||||||
|
LOG_CHANNEL=
|
||||||
|
SUPPORT_CHAT=YasirPediaChannel
|
||||||
|
USER_SESSION=
|
||||||
|
OPENAI_API=
|
||||||
|
CURRENCY_API=
|
||||||
|
|
|
||||||
13
locales/en-US/grup_tools.json
Normal file
13
locales/en-US/grup_tools.json
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"sudo_join_msg": "Wow, my cool owner just joined the group!",
|
||||||
|
"log_bot_added": "#New Group\nGroup = {ttl}(<code>{cid}</code>)\nNumber of Members = <code>{tot}</code>\nAdded by - {r_j}",
|
||||||
|
"support_btn": "Support",
|
||||||
|
"help_btn": "ℹ️ Help",
|
||||||
|
"update_btn": "📢 Updates",
|
||||||
|
"chat_not_allowed": "<b>CHAT NOT ALLOWED 🐞\n\nMy owner has banned me from working here! You can contact the owner of this bot..</b>",
|
||||||
|
"welcome_thanks": "<b>Thank you for adding me to {ttl} ❣️\n\nIf you have any problems or suggestions, you can contact me.</b>",
|
||||||
|
"capt_welc": "Hi {umention} [<code>{uid}</code>], Welcome to the {ttl} group.",
|
||||||
|
"combot_msg": "<b>#CAS Federation Ban</b>\nUser {umention} [<code>{uid}</code>] has been detected as a spambot and has been banned. Powered by <a href='https://api.cas.chat/check?user_id={u.id}'>Combot AntiSpam.</a>",
|
||||||
|
"spamwatch_msg": "<b>#SpamWatch Federation Ban</b>\nUser {umention} [<code>{uid}</code>] has been banned for <code>{reas}</code>.\n" ,
|
||||||
|
"welcpic_msg": "Welcome {userr} [{id}]"
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"no_uname": "<code>No Username</code>",
|
"no_uname": "<code>No Username</code>",
|
||||||
"no_last_name": "<code>No Last Name</code>",
|
"no_last_name": "<code>No Last Name</code>",
|
||||||
"uname_change_msg": "✨ Changed username from {bef} ➡️ <code>{aft}</code>.\n",
|
"uname_change_msg": "✨ Changed username from {bef} ➡️ {aft}.\n",
|
||||||
"lastname_change_msg": "✨ Changed last name from {bef} ➡️ <code>{aft}</code>.\n",
|
"lastname_change_msg": "✨ Changed last name from {bef} ➡️ {aft}.\n",
|
||||||
"firstname_change_msg": "✨ Changed first name from {bef} ➡️ <code>{aft}</code>.\n",
|
"firstname_change_msg": "✨ Changed first name from {bef} ➡️ {aft}.\n",
|
||||||
"set_sangmata_help": "Use <code>/{cmd} on</code>, to enable sangmata. If you want disable, you can use off parameter.",
|
"set_sangmata_help": "Use <code>/{cmd} on</code>, to enable sangmata. If you want disable, you can use off parameter.",
|
||||||
"sangmata_already_on": "SangMata already enabled in your groups.",
|
"sangmata_already_on": "SangMata already enabled in your groups.",
|
||||||
"sangmata_enabled": "Sangmata enabled in your groups.",
|
"sangmata_enabled": "Sangmata enabled in your groups.",
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"no_res": "No result found for `{kweri}`",
|
"no_res": "No result found for `{kweri}`",
|
||||||
"dl_btn": "Download",
|
"dl_btn": "Download",
|
||||||
"back": "Back",
|
"back": "Back",
|
||||||
"yts_msg": "Published {pub}\n\n<b>❯ Duration:</b> {dur}\n<b>❯ Views:</b> {vi}\n<b>❯ Uploader:</b> <a href={clink}>{cname}</a>\n\n",
|
"yts_msg": "Published {pub}\n\n<b>❯ Duration:</b> {dur}\n<b>❯ Views:</b> {vi}\n<b>❯ Uploader:</b> <a href='{clink}'>{cname}</a>\n\n",
|
||||||
"invalid_link": "Please input a valid YT-DLP Supported URL",
|
"invalid_link": "Please input a valid YT-DLP Supported URL",
|
||||||
"err_parse": "Failed parse URL, check logs..",
|
"err_parse": "Failed parse URL, check logs..",
|
||||||
"wait": "Please wait..",
|
"wait": "Please wait..",
|
||||||
|
|
|
||||||
13
locales/id-ID/grup_tools.json
Normal file
13
locales/id-ID/grup_tools.json
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"sudo_join_msg": "Waw, Pemilikku yang keren baru saja bergabung ke grup!",
|
||||||
|
"log_bot_added": "#GrupBaru\nGrup = {ttl}(<code>{cid}</code>)\nJumlah Anggota = <code>{tot}</code>\nDitambahkan oleh - {r_j}",
|
||||||
|
"support_btn": "Dukungan",
|
||||||
|
"help_btn": "ℹ️ Bantuan",
|
||||||
|
"update_btn": "📢 Updates",
|
||||||
|
"chat_not_allowed": "<b>CHAT TIDAK DIIJINKAN 🐞\n\nPemilik saya sudah melarang saya untuk bekerja disini! Kamu bisa menghubungi pemilik bot ini..</b>",
|
||||||
|
"welcome_thanks": "<b>Terimakasih sudah menambahkan saya di {ttl} ❣️\n\nJika ada kendala atau saran bisa kontak ke saya.</b>",
|
||||||
|
"capt_welc": "Hai {umention} [<code>{uid}</code>], Selamat datang digrup {ttl}.",
|
||||||
|
"combot_msg": "<b>#CAS Federation Ban</b>\nPengguna {umention} [<code>{uid}</code>] terdeteksi sebagai spambot dan telah dikeluarkan. Powered by <a href='https://api.cas.chat/check?user_id={u.id}'>Combot AntiSpam.</a>",
|
||||||
|
"spamwatch_msg": "<b>#SpamWatch Federation Ban</b>\nPengguna {umention} [<code>{uid}</code>] telah dikeluarkan karena <code>{reas}</code>.\n",
|
||||||
|
"welcpic_msg": "Selamat Datang {userr} [{id}]"
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"no_uname": "<code>Tanpa Username</code>",
|
"no_uname": "<code>Tanpa Username</code>",
|
||||||
"no_last_name": "<code>Tanpa Nama Belakang</code>",
|
"no_last_name": "<code>Tanpa Nama Belakang</code>",
|
||||||
"uname_change_msg": "✨ Mengubah nama depan dari {bef} ➡️ <code>{aft}</code>.\n",
|
"uname_change_msg": "✨ Mengubah nama depan dari {bef} ➡️ {aft}.\n",
|
||||||
"lastname_change_msg": "✨ Mengubah nama belakang dari {bef} ➡️ <code>{aft}</code>.\n",
|
"lastname_change_msg": "✨ Mengubah nama belakang dari {bef} ➡️ {aft}.\n",
|
||||||
"firstname_change_msg": "✨ Mengubah nama depan dari {bef} ➡️ <code>{aft}</code>.\n",
|
"firstname_change_msg": "✨ Mengubah nama depan dari {bef} ➡️ {aft}.\n",
|
||||||
"set_sangmata_help": "Gunakan <code>/{cmd} on</code>, untuk mengaktifkan sangmata. Jika Anda ingin menonaktifkan, Anda dapat menggunakan parameter off.",
|
"set_sangmata_help": "Gunakan <code>/{cmd} on</code>, untuk mengaktifkan sangmata. Jika Anda ingin menonaktifkan, Anda dapat menggunakan parameter off.",
|
||||||
"sangmata_already_on": "SangMata telah diaktifkan di grup Anda.",
|
"sangmata_already_on": "SangMata telah diaktifkan di grup Anda.",
|
||||||
"sangmata_enabled": "Sangmata diaktifkan di grup Anda.",
|
"sangmata_enabled": "Sangmata diaktifkan di grup Anda.",
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"no_res": "Tidak ada hasil yang ditemukan untuk `{kweri}`",
|
"no_res": "Tidak ada hasil yang ditemukan untuk `{kweri}`",
|
||||||
"dl_btn": "Unduh",
|
"dl_btn": "Unduh",
|
||||||
"kembali": "kembali",
|
"kembali": "kembali",
|
||||||
"yts_msg": "Dipublikasikan {pub}\n\n<b>❯ Durasi:</b> {dur}\n<b>❯ Penayangan:</b> {vi}\n<b>❯ Pengunggah:< /b> <a href={clink}>{cname}</a>\n\n",
|
"yts_msg": "Dipublikasikan {pub}\n\n<b>❯ Durasi:</b> {dur}\n<b>❯ Penayangan:</b> {vi}\n<b>❯ Pengunggah:</b> <a href='{clink}'>{cname}</a>\n\n",
|
||||||
"invalid_link": "Masukkan URL yang Didukung YT-DLP yang valid",
|
"invalid_link": "Masukkan URL yang Didukung YT-DLP yang valid",
|
||||||
"err_parse": "Gagal menguraikan URL, periksa log..",
|
"err_parse": "Gagal menguraikan URL, periksa log..",
|
||||||
"tunggu": "Harap tunggu..",
|
"tunggu": "Harap tunggu..",
|
||||||
|
|
|
||||||
13
locales/id-JW/grup_tools.json
Normal file
13
locales/id-JW/grup_tools.json
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"sudo_join_msg": "Waw, Pemilikku sing ganteng gabung menyang grup!",
|
||||||
|
"log_bot_added": "#GrupBaru\nGrup = {ttl}(<code>{cid}</code>)\nJumlah Anggota = <code>{tot}</code>\nDitambahake dening - {r_j}",
|
||||||
|
"support_btn": "Dukungan",
|
||||||
|
"help_btn": "ℹ️ Pitulungan",
|
||||||
|
"update_btn": "📢 Nganyari",
|
||||||
|
"chat_not_allowed": "<b>CHAT ORA DIIJINKE 🐞\n\nPemilik ku wes nglarang aku kerja neng kene! Sampeyan bisa hubungi pemilik bot iki..</b>",
|
||||||
|
"welcome_thanks": "<b>Terimakasih wis nambahi saya ing {ttl} ❣️\n\nYen ana kendal utawa saran bisa hubungi saya.</b>",
|
||||||
|
"capt_welc": "Hai {umention} [<code>{uid}</code>], sugeng rawuh ing grup {ttl}.",
|
||||||
|
"combot_msg": "<b>Larangan Federasi #CAS</b>\nPengguna {umention} [<kode>{uid}</code>] dideteksi minangka spambot lan wis dibusak. Powered by <a href='https://api.cas.chat/check?user_id={u.id}'>Combot AntiSpam.</a>",
|
||||||
|
"spamwatch_msg": "<b>Larangan Federasi #SpamWatch</b>\nPengguna {umention} [<code>{uid}</code>] wis dibusak amarga <code>{reas}</code>.\n" ,
|
||||||
|
"welcpic_msg": "Sugeng Rawuh {userr} [{id}]"
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"no_uname": "<code>Ora Jeneng Panganggo</code>",
|
"no_uname": "<code>Ora Jeneng Panganggo</code>",
|
||||||
"no_last_name": "<kode>Ora Ana Jeneng mburi</code>",
|
"no_last_name": "<kode>Ora Ana Jeneng mburi</code>",
|
||||||
"uname_change_msg": "✨ Jeneng pangguna diganti saka {bef} ➡️ <code>{aft}</code>.\n",
|
"uname_change_msg": "✨ Jeneng pangguna diganti saka {bef} ➡️ {aft}.\n",
|
||||||
"lastname_change_msg": "✨ Ganti jeneng mburi saka {bef} ➡️ <code>{aft}</code>.\n",
|
"lastname_change_msg": "✨ Ganti jeneng mburi saka {bef} ➡️ {aft}.\n",
|
||||||
"firstname_change_msg": "✨ Ganti jeneng ngarep saka {bef} ➡️ <code>{aft}</code>.\n",
|
"firstname_change_msg": "✨ Ganti jeneng ngarep saka {bef} ➡️ {aft}.\n",
|
||||||
"set_sangmata_help": "Gunakake <code>/{cmd} on</code>, kanggo ngaktifake sangmata. Yen sampeyan pengin mateni, sampeyan bisa nggunakake parameter mati.",
|
"set_sangmata_help": "Gunakake <code>/{cmd} on</code>, kanggo ngaktifake sangmata. Yen sampeyan pengin mateni, sampeyan bisa nggunakake parameter mati.",
|
||||||
"sangmata_already_on": "SangMata wis diaktifake ing grup sampeyan.",
|
"sangmata_already_on": "SangMata wis diaktifake ing grup sampeyan.",
|
||||||
"sangmata_enabled": "Sangmata diaktifake ing grup sampeyan.",
|
"sangmata_enabled": "Sangmata diaktifake ing grup sampeyan.",
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"back_btn": "↩️ Mbalik",
|
"back_btn": "↩️ Mbalik",
|
||||||
"dl_text": "⬇️ Unduh",
|
"dl_text": "⬇️ Unduh",
|
||||||
"cat_text": "💠 Kategori",
|
"cat_text": "💠 Kategori",
|
||||||
"kualitas": "Kualitas",
|
"kualitas": "Kwalitas",
|
||||||
"ex_data": "👇 Ekstrak Data ",
|
"ex_data": "👇 Ekstrak Data ",
|
||||||
"unauth": "Tombol iki dudu kanggo sampeyan..",
|
"unauth": "Tombol iki dudu kanggo sampeyan..",
|
||||||
"invalid_cb": "Data callback ora valid, kirim printah maneh..",
|
"invalid_cb": "Data callback ora valid, kirim printah maneh..",
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"no_res": "Ora ana asil kanggo `{kweri}`",
|
"no_res": "Ora ana asil kanggo `{kweri}`",
|
||||||
"dl_btn": "Ngunduh",
|
"dl_btn": "Ngunduh",
|
||||||
"back": "Mbalik",
|
"back": "Mbalik",
|
||||||
"yts_msg": "Diterbitake {pub}\n\n<b>❯ Duration:</b> {dur}\n<b>❯ Ndeleng:</b> {vi}\n<b>❯ Uploader:< /b> <a href={clink}>{cname}</a>\n\n",
|
"yts_msg": "Diterbitake {pub}\n\n<b>❯ Duration:</b> {dur}\n<b>❯ Ndeleng:</b> {vi}\n<b>❯ Uploader:</b> <a href='{clink}'>{cname}</a>\n\n",
|
||||||
"invalid_link": "Mangga lebokna URL Dhukungan YT-DLP sing valid",
|
"invalid_link": "Mangga lebokna URL Dhukungan YT-DLP sing valid",
|
||||||
"err_parse": "Gagal ngurai URL, mriksa log..",
|
"err_parse": "Gagal ngurai URL, mriksa log..",
|
||||||
"ngenteni": "Tulung ngenteni..",
|
"ngenteni": "Tulung ngenteni..",
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,6 @@ async def member_permissions(chat_id: int, user_id: int):
|
||||||
perms = []
|
perms = []
|
||||||
try:
|
try:
|
||||||
member = (await app.get_chat_member(chat_id, user_id)).privileges
|
member = (await app.get_chat_member(chat_id, user_id)).privileges
|
||||||
except Exception:
|
|
||||||
return []
|
|
||||||
if member.can_post_messages:
|
if member.can_post_messages:
|
||||||
perms.append("can_post_messages")
|
perms.append("can_post_messages")
|
||||||
if member.can_edit_messages:
|
if member.can_edit_messages:
|
||||||
|
|
@ -38,6 +36,8 @@ async def member_permissions(chat_id: int, user_id: int):
|
||||||
if member.can_manage_video_chats:
|
if member.can_manage_video_chats:
|
||||||
perms.append("can_manage_video_chats")
|
perms.append("can_manage_video_chats")
|
||||||
return perms
|
return perms
|
||||||
|
except:
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
async def check_perms(
|
async def check_perms(
|
||||||
|
|
@ -126,12 +126,8 @@ async def check_perms(
|
||||||
else:
|
else:
|
||||||
sender = message.reply_text
|
sender = message.reply_text
|
||||||
chat = message.chat
|
chat = message.chat
|
||||||
# TODO: Cache all admin permissions in db.
|
|
||||||
if not message.from_user:
|
if not message.from_user:
|
||||||
# For anonymous admins
|
return bool(message.sender_chat and message.sender_chat.id == message.chat.id)
|
||||||
if message.sender_chat and message.sender_chat.id == message.chat.id:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
user = await chat.get_member(message.from_user.id)
|
user = await chat.get_member(message.from_user.id)
|
||||||
if user.status == enums.ChatMemberStatus.OWNER:
|
if user.status == enums.ChatMemberStatus.OWNER:
|
||||||
return True
|
return True
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from time import time
|
||||||
|
|
||||||
from pyrogram import enums, filters
|
from pyrogram import enums, filters
|
||||||
from pyrogram.errors import ChatAdminRequired, FloodWait
|
from pyrogram.errors import ChatAdminRequired, FloodWait
|
||||||
from pyrogram.types import ChatPermissions
|
from pyrogram.types import ChatPermissions, ChatPrivileges
|
||||||
|
|
||||||
from database.warn_db import add_warn, get_warn, remove_warns
|
from database.warn_db import add_warn, get_warn, remove_warns
|
||||||
from misskaty import app
|
from misskaty import app
|
||||||
|
|
@ -366,6 +366,7 @@ async def promoteFunc(client, message, strings):
|
||||||
if message.command[0][0] == "f":
|
if message.command[0][0] == "f":
|
||||||
await message.chat.promote_member(
|
await message.chat.promote_member(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
|
privileges=ChatPrivileges(
|
||||||
can_change_info=bot.privileges.can_change_info,
|
can_change_info=bot.privileges.can_change_info,
|
||||||
can_invite_users=bot.privileges.can_invite_users,
|
can_invite_users=bot.privileges.can_invite_users,
|
||||||
can_delete_messages=bot.privileges.can_delete_messages,
|
can_delete_messages=bot.privileges.can_delete_messages,
|
||||||
|
|
@ -374,11 +375,13 @@ async def promoteFunc(client, message, strings):
|
||||||
can_promote_members=bot.privileges.can_promote_members,
|
can_promote_members=bot.privileges.can_promote_members,
|
||||||
can_manage_chat=bot.privileges.can_manage_chat,
|
can_manage_chat=bot.privileges.can_manage_chat,
|
||||||
can_manage_video_chats=bot.privileges.can_manage_video_chats,
|
can_manage_video_chats=bot.privileges.can_manage_video_chats,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
return await message.reply_text(strings("full_promote").format(umention=umention))
|
return await message.reply_text(strings("full_promote").format(umention=umention))
|
||||||
|
|
||||||
await message.chat.promote_member(
|
await message.chat.promote_member(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
|
privileges=ChatPrivileges(
|
||||||
can_change_info=False,
|
can_change_info=False,
|
||||||
can_invite_users=bot.privileges.can_invite_users,
|
can_invite_users=bot.privileges.can_invite_users,
|
||||||
can_delete_messages=bot.privileges.can_delete_messages,
|
can_delete_messages=bot.privileges.can_delete_messages,
|
||||||
|
|
@ -387,6 +390,7 @@ async def promoteFunc(client, message, strings):
|
||||||
can_promote_members=False,
|
can_promote_members=False,
|
||||||
can_manage_chat=bot.privileges.can_manage_chat,
|
can_manage_chat=bot.privileges.can_manage_chat,
|
||||||
can_manage_video_chats=bot.privileges.can_manage_video_chats,
|
can_manage_video_chats=bot.privileges.can_manage_video_chats,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
await message.reply_text(strings("normal_promote").format(umention=umention))
|
await message.reply_text(strings("normal_promote").format(umention=umention))
|
||||||
|
|
||||||
|
|
@ -408,6 +412,7 @@ async def demote(client, message, strings):
|
||||||
return await message.reply_text(strings("demote_sudo_err"))
|
return await message.reply_text(strings("demote_sudo_err"))
|
||||||
await message.chat.promote_member(
|
await message.chat.promote_member(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
|
privileges=ChatPrivileges(
|
||||||
can_change_info=False,
|
can_change_info=False,
|
||||||
can_invite_users=False,
|
can_invite_users=False,
|
||||||
can_delete_messages=False,
|
can_delete_messages=False,
|
||||||
|
|
@ -416,6 +421,7 @@ async def demote(client, message, strings):
|
||||||
can_promote_members=False,
|
can_promote_members=False,
|
||||||
can_manage_chat=False,
|
can_manage_chat=False,
|
||||||
can_manage_video_chats=False,
|
can_manage_video_chats=False,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
umention = (await app.get_users(user_id)).mention
|
umention = (await app.get_users(user_id)).mention
|
||||||
await message.reply_text(f"Demoted! {umention}")
|
await message.reply_text(f"Demoted! {umention}")
|
||||||
|
|
|
||||||
|
|
@ -18,15 +18,18 @@ LOGGER = logging.getLogger(__name__)
|
||||||
@app.on_message(filters.command(["currency"], COMMAND_HANDLER))
|
@app.on_message(filters.command(["currency"], COMMAND_HANDLER))
|
||||||
async def currency(c: Client, m: Message):
|
async def currency(c: Client, m: Message):
|
||||||
if CURRENCY_API is None:
|
if CURRENCY_API is None:
|
||||||
return await kirimPesan(m, f"<code>Oops!!get the API from</code> " "<a href='https://app.exchangerate-api.com/sign-up'>HERE</a> " "<code>& add it to config vars</code> (<code>CURRENCY_API</code>)", disable_web_page_preview=True)
|
return await kirimPesan(
|
||||||
if len(m.text.split()) == 4:
|
m,
|
||||||
|
"<code>Oops!!get the API from</code> <a href='https://app.exchangerate-api.com/sign-up'>HERE</a> <code>& add it to config vars</code> (<code>CURRENCY_API</code>)",
|
||||||
|
disable_web_page_preview=True,
|
||||||
|
)
|
||||||
|
if len(m.text.split()) != 4:
|
||||||
|
return await kirimPesan(m, f"Use format /{m.command[0]} [amount] [currency_from] [currency_to] to convert currency.")
|
||||||
|
|
||||||
teks = m.text.split()
|
teks = m.text.split()
|
||||||
amount = teks[1]
|
amount = teks[1]
|
||||||
currency_from = teks[2]
|
currency_from = teks[2]
|
||||||
currency_to = teks[3]
|
currency_to = teks[3]
|
||||||
else:
|
|
||||||
return await kirimPesan(m, f"Use format /{m.command[0]} [amount] [currency_from] [currency_to] to convert currency.")
|
|
||||||
|
|
||||||
if amount.isdigit():
|
if amount.isdigit():
|
||||||
url = f"https://v6.exchangerate-api.com/v6/{CURRENCY_API}/" f"pair/{currency_from}/{currency_to}/{amount}"
|
url = f"https://v6.exchangerate-api.com/v6/{CURRENCY_API}/" f"pair/{currency_from}/{currency_to}/{amount}"
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,9 @@ __HELP__ = """
|
||||||
/json - Send structure message Telegram in JSON using Pyrogram Style.
|
/json - Send structure message Telegram in JSON using Pyrogram Style.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
var = {}
|
||||||
|
teskode = {}
|
||||||
|
|
||||||
|
|
||||||
async def edit_or_reply(msg, **kwargs):
|
async def edit_or_reply(msg, **kwargs):
|
||||||
func = msg.edit_text if msg.from_user.is_self else msg.reply
|
func = msg.edit_text if msg.from_user.is_self else msg.reply
|
||||||
|
|
@ -51,7 +54,8 @@ async def edit_or_reply(msg, **kwargs):
|
||||||
@use_chat_lang()
|
@use_chat_lang()
|
||||||
async def log_file(bot, message, strings):
|
async def log_file(bot, message, strings):
|
||||||
"""Send log file"""
|
"""Send log file"""
|
||||||
try:
|
msg = await kirimPesan(message, "<b>Reading bot logs ...</b>")
|
||||||
|
if len(message.command) == 1:
|
||||||
await message.reply_document(
|
await message.reply_document(
|
||||||
"MissKatyLogs.txt",
|
"MissKatyLogs.txt",
|
||||||
caption="Log Bot MissKatyPyro",
|
caption="Log Bot MissKatyPyro",
|
||||||
|
|
@ -66,9 +70,11 @@ async def log_file(bot, message, strings):
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
except:
|
await hapusPesan(msg)
|
||||||
err = traceback.format_exc()
|
elif len(message.command) == 2:
|
||||||
await message.reply(str(err))
|
val = message.text.split()
|
||||||
|
tail = await shell_exec(f"tail -n {val[1]} -v MissKatyLogs.txt")
|
||||||
|
await editPesan(msg, f"<pre language='bash'>{html.escape(tail[0])}</pre>")
|
||||||
|
|
||||||
|
|
||||||
@app.on_message(filters.command(["donate"], COMMAND_HANDLER))
|
@app.on_message(filters.command(["donate"], COMMAND_HANDLER))
|
||||||
|
|
@ -192,6 +198,9 @@ async def cmd_eval(self, message: types.Message, strings) -> Optional[str]:
|
||||||
"self": self,
|
"self": self,
|
||||||
"humantime": humantime,
|
"humantime": humantime,
|
||||||
"m": message,
|
"m": message,
|
||||||
|
"var": var,
|
||||||
|
"app": app,
|
||||||
|
"teskode": teskode,
|
||||||
"re": re,
|
"re": re,
|
||||||
"os": os,
|
"os": os,
|
||||||
"asyncio": asyncio,
|
"asyncio": asyncio,
|
||||||
|
|
@ -205,6 +214,8 @@ async def cmd_eval(self, message: types.Message, strings) -> Optional[str]:
|
||||||
"http": http,
|
"http": http,
|
||||||
"replied": message.reply_to_message,
|
"replied": message.reply_to_message,
|
||||||
}
|
}
|
||||||
|
eval_vars.update(var)
|
||||||
|
eval_vars.update(teskode)
|
||||||
try:
|
try:
|
||||||
return "", await meval(code, globals(), **eval_vars)
|
return "", await meval(code, globals(), **eval_vars)
|
||||||
except Exception as e: # skipcq: PYL-W0703
|
except Exception as e: # skipcq: PYL-W0703
|
||||||
|
|
@ -232,7 +243,7 @@ async def cmd_eval(self, message: types.Message, strings) -> Optional[str]:
|
||||||
el_str = get_readable_time(el_us)
|
el_str = get_readable_time(el_us)
|
||||||
except:
|
except:
|
||||||
el_str = "1s"
|
el_str = "1s"
|
||||||
if el_str == "" or el_str is None:
|
if not el_str or el_str is None:
|
||||||
el_str = "0.1s"
|
el_str = "0.1s"
|
||||||
|
|
||||||
out = out_buf.getvalue()
|
out = out_buf.getvalue()
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ from misskaty import BOT_USERNAME, app
|
||||||
from misskaty.core.decorator.ratelimiter import ratelimiter
|
from misskaty.core.decorator.ratelimiter import ratelimiter
|
||||||
from misskaty.core.decorator.errors import asyncify, capture_err
|
from misskaty.core.decorator.errors import asyncify, capture_err
|
||||||
from misskaty.helper.http import http
|
from misskaty.helper.http import http
|
||||||
|
from misskaty.helper.localization import use_chat_lang
|
||||||
from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL, SUDO, SUPPORT_CHAT
|
from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL, SUDO, SUPPORT_CHAT
|
||||||
from utils import temp
|
from utils import temp
|
||||||
|
|
||||||
|
|
@ -47,14 +48,14 @@ def draw_multiple_line_text(image, text, font, text_start_height):
|
||||||
|
|
||||||
|
|
||||||
@asyncify
|
@asyncify
|
||||||
def welcomepic(pic, user, chat, id):
|
def welcomepic(pic, user, chat, id, strings):
|
||||||
background = Image.open("assets/bg.png") # <- Background Image (Should be PNG)
|
background = Image.open("assets/bg.png") # <- Background Image (Should be PNG)
|
||||||
background = background.resize((1024, 500), Image.ANTIALIAS)
|
background = background.resize((1024, 500), Image.ANTIALIAS)
|
||||||
pfp = Image.open(pic).convert("RGBA")
|
pfp = Image.open(pic).convert("RGBA")
|
||||||
pfp = circle(pfp)
|
pfp = circle(pfp)
|
||||||
pfp = pfp.resize((265, 265)) # Resizes the Profilepicture so it fits perfectly in the circle
|
pfp = pfp.resize((265, 265)) # Resizes the Profilepicture so it fits perfectly in the circle
|
||||||
font = ImageFont.truetype("assets/Calistoga-Regular.ttf", 37) # <- Text Font of the Member Count. Change the text size for your preference
|
font = ImageFont.truetype("assets/Calistoga-Regular.ttf", 37) # <- Text Font of the Member Count. Change the text size for your preference
|
||||||
member_text = f"Selamat Datang {user} [{id}]" # <- Text under the Profilepicture with the Membercount
|
member_text = strings("welcpic_msg").format(userr=user, id=id) # <- Text under the Profilepicture with the Membercount
|
||||||
draw_multiple_line_text(background, member_text, font, 395)
|
draw_multiple_line_text(background, member_text, font, 395)
|
||||||
draw_multiple_line_text(background, chat, font, 47)
|
draw_multiple_line_text(background, chat, font, 47)
|
||||||
ImageDraw.Draw(background).text(
|
ImageDraw.Draw(background).text(
|
||||||
|
|
@ -70,14 +71,15 @@ def welcomepic(pic, user, chat, id):
|
||||||
|
|
||||||
|
|
||||||
@app.on_chat_member_updated(filters.group & filters.chat([-1001128045651, -1001777794636]))
|
@app.on_chat_member_updated(filters.group & filters.chat([-1001128045651, -1001777794636]))
|
||||||
async def member_has_joined(c: app, member: ChatMemberUpdated):
|
@use_chat_lang()
|
||||||
|
async def member_has_joined(c: app, member: ChatMemberUpdated, strings):
|
||||||
if not member.new_chat_member or member.new_chat_member.status in {"banned", "left", "restricted"} or member.old_chat_member:
|
if not member.new_chat_member or member.new_chat_member.status in {"banned", "left", "restricted"} or member.old_chat_member:
|
||||||
return
|
return
|
||||||
user = member.new_chat_member.user if member.new_chat_member else member.from_user
|
user = member.new_chat_member.user if member.new_chat_member else member.from_user
|
||||||
if user.id in SUDO:
|
if user.id in SUDO:
|
||||||
await c.send_message(
|
await c.send_message(
|
||||||
member.chat.id,
|
member.chat.id,
|
||||||
"Waw, owner ku yang keren baru saja bergabung ke grup!",
|
strings("sudo_join_msg"),
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
elif user.is_bot:
|
elif user.is_bot:
|
||||||
|
|
@ -98,7 +100,7 @@ async def member_has_joined(c: app, member: ChatMemberUpdated):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pic = "assets/profilepic.png"
|
pic = "assets/profilepic.png"
|
||||||
try:
|
try:
|
||||||
welcomeimg = await welcomepic(pic, user.first_name, member.chat.title, user.id)
|
welcomeimg = await welcomepic(pic, user.first_name, member.chat.title, user.id, strings)
|
||||||
temp.MELCOW[f"welcome-{member.chat.id}"] = await c.send_photo(
|
temp.MELCOW[f"welcome-{member.chat.id}"] = await c.send_photo(
|
||||||
member.chat.id,
|
member.chat.id,
|
||||||
photo=welcomeimg,
|
photo=welcomeimg,
|
||||||
|
|
@ -113,7 +115,7 @@ async def member_has_joined(c: app, member: ChatMemberUpdated):
|
||||||
apispamwatch = (await http.get(f"https://api.spamwat.ch/banlist/{user.id}", headers=headers)).json()
|
apispamwatch = (await http.get(f"https://api.spamwat.ch/banlist/{user.id}", headers=headers)).json()
|
||||||
if not apispamwatch.get("error"):
|
if not apispamwatch.get("error"):
|
||||||
await app.ban_chat_member(member.chat.id, user.id, datetime.now() + timedelta(seconds=30))
|
await app.ban_chat_member(member.chat.id, user.id, datetime.now() + timedelta(seconds=30))
|
||||||
userspammer += f"<b>#SpamWatch Federation Ban</b>\nUser {mention} [<code>{user.id}</code>] has been kicked because <code>{apispamwatch.get('reason')}</code>.\n"
|
userspammer += strings("spamwatch_msg").format(umention=user.mention, uid=user.id, reas=apispamwatch.get("reason"))
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
LOGGER.error(f"ERROR in Spamwatch Detection. {err}")
|
LOGGER.error(f"ERROR in Spamwatch Detection. {err}")
|
||||||
# Combot API Detection
|
# Combot API Detection
|
||||||
|
|
@ -121,7 +123,7 @@ async def member_has_joined(c: app, member: ChatMemberUpdated):
|
||||||
apicombot = (await http.get(f"https://api.cas.chat/check?user_id={user.id}")).json()
|
apicombot = (await http.get(f"https://api.cas.chat/check?user_id={user.id}")).json()
|
||||||
if apicombot.get("ok") == "true":
|
if apicombot.get("ok") == "true":
|
||||||
await app.ban_chat_member(member.chat.id, user.id, datetime.now() + timedelta(seconds=30))
|
await app.ban_chat_member(member.chat.id, user.id, datetime.now() + timedelta(seconds=30))
|
||||||
userspammer += f"<b>#CAS Federation Ban</b>\nUser {mention} [<code>{user.id}</code>] detected as spambot and has been kicked. Powered by <a href='https://api.cas.chat/check?user_id={user.id}'>Combot AntiSpam.</a>"
|
userspammer += strings("combot_msg").format(umention=user.mention, uid=user.id)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
LOGGER.error(f"ERROR in Combot API Detection. {err}")
|
LOGGER.error(f"ERROR in Combot API Detection. {err}")
|
||||||
if userspammer != "":
|
if userspammer != "":
|
||||||
|
|
@ -134,7 +136,8 @@ async def member_has_joined(c: app, member: ChatMemberUpdated):
|
||||||
|
|
||||||
|
|
||||||
@app.on_message(filters.new_chat_members & filters.group)
|
@app.on_message(filters.new_chat_members & filters.group)
|
||||||
async def save_group(bot, message):
|
@use_chat_lang()
|
||||||
|
async def save_group(bot, message, strings):
|
||||||
r_j_check = [u.id for u in message.new_chat_members]
|
r_j_check = [u.id for u in message.new_chat_members]
|
||||||
if temp.ME in r_j_check:
|
if temp.ME in r_j_check:
|
||||||
if not await db.get_chat(message.chat.id):
|
if not await db.get_chat(message.chat.id):
|
||||||
|
|
@ -142,16 +145,16 @@ async def save_group(bot, message):
|
||||||
r_j = message.from_user.mention if message.from_user else "Anonymous"
|
r_j = message.from_user.mention if message.from_user else "Anonymous"
|
||||||
await bot.send_message(
|
await bot.send_message(
|
||||||
LOG_CHANNEL,
|
LOG_CHANNEL,
|
||||||
f"#NewGroup\nGroup = {message.chat.title}(<code>{message.chat.id}</code>)\nMembers Count = <code>{total}</code>\nAdded by - {r_j}",
|
strings("log_bot_added").format(ttl=message.chat.title, cid=message.chat.id, tot=total, r_j=r_j),
|
||||||
)
|
)
|
||||||
|
|
||||||
await db.add_chat(message.chat.id, message.chat.title)
|
await db.add_chat(message.chat.id, message.chat.title)
|
||||||
if message.chat.id in temp.BANNED_CHATS:
|
if message.chat.id in temp.BANNED_CHATS:
|
||||||
# Inspired from a boat of a banana tree
|
# Inspired from a boat of a banana tree
|
||||||
buttons = [[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]]
|
buttons = [[InlineKeyboardButton(strings("support_btn"), url=f"https://t.me/{SUPPORT_CHAT}")]]
|
||||||
reply_markup = InlineKeyboardMarkup(buttons)
|
reply_markup = InlineKeyboardMarkup(buttons)
|
||||||
k = await message.reply(
|
k = await message.reply(
|
||||||
text="<b>CHAT NOT ALLOWED 🐞\n\nMy admins has restricted me from working here ! If you want to know more about it contact support..</b>",
|
text=strings("chat_not_allowed"),
|
||||||
reply_markup=reply_markup,
|
reply_markup=reply_markup,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -163,13 +166,13 @@ async def save_group(bot, message):
|
||||||
return
|
return
|
||||||
buttons = [
|
buttons = [
|
||||||
[
|
[
|
||||||
InlineKeyboardButton("ℹ️ Help", url=f"https://t.me/{temp.U_NAME}?start=help"),
|
InlineKeyboardButton(strings("help_btn"), url=f"https://t.me/{temp.U_NAME}?start=help"),
|
||||||
InlineKeyboardButton("📢 Updates", url="https://t.me/YasirPediaChannel"),
|
InlineKeyboardButton(strings("update_btn"), url="https://t.me/YasirPediaChannel"),
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
reply_markup = InlineKeyboardMarkup(buttons)
|
reply_markup = InlineKeyboardMarkup(buttons)
|
||||||
await message.reply_text(
|
await message.reply_text(
|
||||||
text=f"<b>Terimakasih sudah menambahkan saya di {message.chat.title} ❣️\n\nJika ada kendala atau saran bisa kontak ke saya.</b>",
|
text=strings("welcome_thanks").format(ttl=message.chat.title),
|
||||||
reply_markup=reply_markup,
|
reply_markup=reply_markup,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
|
@ -184,11 +187,11 @@ async def save_group(bot, message):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
welcomeimg = await welcomepic(pic, u.first_name, message.chat.title, u.id)
|
welcomeimg = await welcomepic(pic, u.first_name, message.chat.title, u.id, strings)
|
||||||
temp.MELCOW[f"welcome-{message.chat.id}"] = await app.send_photo(
|
temp.MELCOW[f"welcome-{message.chat.id}"] = await app.send_photo(
|
||||||
message.chat.id,
|
message.chat.id,
|
||||||
photo=welcomeimg,
|
photo=welcomeimg,
|
||||||
caption=f"Hai {u.mention}, Selamat datang digrup {message.chat.title}.",
|
caption=strings("capt_welc").format(umention=u.mention, uid=u.id, ttl=message.chat.title),
|
||||||
)
|
)
|
||||||
userspammer = ""
|
userspammer = ""
|
||||||
# Spamwatch Detection
|
# Spamwatch Detection
|
||||||
|
|
@ -197,7 +200,7 @@ async def save_group(bot, message):
|
||||||
apispamwatch = (await http.get(f"https://api.spamwat.ch/banlist/{u.id}", headers=headers)).json()
|
apispamwatch = (await http.get(f"https://api.spamwat.ch/banlist/{u.id}", headers=headers)).json()
|
||||||
if not apispamwatch.get("error"):
|
if not apispamwatch.get("error"):
|
||||||
await app.ban_chat_member(message.chat.id, u.id, datetime.now() + timedelta(seconds=30))
|
await app.ban_chat_member(message.chat.id, u.id, datetime.now() + timedelta(seconds=30))
|
||||||
userspammer += f"<b>#SpamWatch Federation Ban</b>\nUser {u.mention} [<code>{u.id}</code>] has been kicked because <code>{apispamwatch.get('reason')}</code>.\n"
|
userspammer += strings("spamwatch_msg").format(umention=u.mention, uid=u.id, reas=apispamwatch.get("reason"))
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
LOGGER.error(f"ERROR in Spamwatch Detection. {err}")
|
LOGGER.error(f"ERROR in Spamwatch Detection. {err}")
|
||||||
# Combot API Detection
|
# Combot API Detection
|
||||||
|
|
@ -205,7 +208,7 @@ async def save_group(bot, message):
|
||||||
apicombot = (await http.get(f"https://api.cas.chat/check?user_id={u.id}")).json()
|
apicombot = (await http.get(f"https://api.cas.chat/check?user_id={u.id}")).json()
|
||||||
if apicombot.get("ok") == "true":
|
if apicombot.get("ok") == "true":
|
||||||
await app.ban_chat_member(message.chat.id, u.id, datetime.now() + timedelta(seconds=30))
|
await app.ban_chat_member(message.chat.id, u.id, datetime.now() + timedelta(seconds=30))
|
||||||
userspammer += f"<b>#CAS Federation Ban</b>\nUser {u.mention} [<code>{u.id}</code>] detected as spambot and has been kicked. Powered by <a href='https://api.cas.chat/check?user_id={u.id}'>Combot AntiSpam.</a>"
|
userspammer += strings("combot_msg").format(umention=u.mention, uid=u.id)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
LOGGER.error(f"ERROR in Combot API Detection. {err}")
|
LOGGER.error(f"ERROR in Combot API Detection. {err}")
|
||||||
if userspammer != "":
|
if userspammer != "":
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import re
|
||||||
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
||||||
from database.users_chats_db import db
|
from database.users_chats_db import db
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
|
from pyrogram.errors import ChannelPrivate
|
||||||
from misskaty import app, BOT_USERNAME, HELPABLE, BOT_NAME
|
from misskaty import app, BOT_USERNAME, HELPABLE, BOT_NAME
|
||||||
from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL
|
from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL
|
||||||
from misskaty.core.message_utils import *
|
from misskaty.core.message_utils import *
|
||||||
|
|
@ -69,7 +70,10 @@ keyboard = InlineKeyboardMarkup(
|
||||||
async def start(_, message, strings):
|
async def start(_, message, strings):
|
||||||
if message.chat.type.value != "private":
|
if message.chat.type.value != "private":
|
||||||
if not await db.get_chat(message.chat.id):
|
if not await db.get_chat(message.chat.id):
|
||||||
|
try:
|
||||||
total = await app.get_chat_members_count(message.chat.id)
|
total = await app.get_chat_members_count(message.chat.id)
|
||||||
|
except ChannelPrivate:
|
||||||
|
return await message.chat.leave()
|
||||||
await app.send_message(
|
await app.send_message(
|
||||||
LOG_CHANNEL,
|
LOG_CHANNEL,
|
||||||
strings("newgroup_log").format(jdl=message.chat.title, id=message.chat.id, c=total),
|
strings("newgroup_log").format(jdl=message.chat.title, id=message.chat.id, c=total),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue