space / bot.py
Skydata001's picture
Update bot.py
4340a48 verified
import discord
from discord.ext import commands, tasks
from discord import app_commands
from discord.ui import Button, View, Select
import asyncio
import random
import os
from datetime import datetime
# =======================================================
# ุงู„ุฅุนุฏุงุฏุงุช ุงู„ุฃุณุงุณูŠุฉ (ุงู„ุซูˆุงุจุช)
# =======================================================
TARGET_GUILD_ID = 1463693244897693779 # ุฃูŠุฏูŠ ุงู„ุณูŠุฑูุฑ ุงู„ู…ุณู…ูˆุญ
OWNER_ROLE_ID = 1492516779598155877 # ุฃูŠุฏูŠ ุฑุชุจุฉ ุงู„ู…ุงู„ูƒ ู„ู„ุชุญูƒู…
# =======================================================
# ุงู„ุฃุฐูƒุงุฑ ูˆุงู„ุชุฐูƒูŠุฑุงุช (ุงู„ู‚ุงุฆู…ุฉ ุงู„ูƒุงู…ู„ุฉ)
# =======================================================
REMINDERS = [
"๐ŸŒธ ุณุจุญุงู† ุงู„ู„ู‡ ูˆุจุญู…ุฏู‡ุŒ ุณุจุญุงู† ุงู„ู„ู‡ ุงู„ุนุธูŠู…",
"โœจ ุงู„ู„ู‡ู… ุตู„ ูˆุณู„ู… ุนู„ู‰ ู†ุจูŠู†ุง ู…ุญู…ุฏ",
"๐Ÿ“ฟ ุฃุณุชุบูุฑ ุงู„ู„ู‡ ุงู„ุนุธูŠู… ูˆุฃุชูˆุจ ุฅู„ูŠู‡",
"๐Ÿ•Š๏ธ ู„ุง ุญูˆู„ ูˆู„ุง ู‚ูˆุฉ ุฅู„ุง ุจุงู„ู„ู‡",
"๐ŸŒฟ ุณุจุญุงู† ุงู„ู„ู‡ุŒ ูˆุงู„ุญู…ุฏ ู„ู„ู‡ุŒ ูˆู„ุง ุฅู„ู‡ ุฅู„ุง ุงู„ู„ู‡ุŒ ูˆุงู„ู„ู‡ ุฃูƒุจุฑ",
"๐ŸŒธ ุณุจุญุงู† ุงู„ู„ู‡", "โœจ ุงู„ุญู…ุฏ ู„ู„ู‡", "๐Ÿ“ฟ ุงู„ู„ู‡ ุฃูƒุจุฑ", "๐Ÿ•Š๏ธ ู„ุง ุฅู„ู‡ ุฅู„ุง ุงู„ู„ู‡",
"๐ŸŒฟ ุงู„ู„ู‡ู… ุงุบูุฑ ู„ูŠ", "๐ŸŒธ ุงู„ู„ู‡ู… ุงุฑุญู…ู†ูŠ", "โœจ ุงู„ู„ู‡ู… ุชุจ ุนู„ูŠ", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ูŠ",
"๐Ÿ•Š๏ธ ุญุณุจูŠ ุงู„ู„ู‡ ูˆู†ุนู… ุงู„ูˆูƒูŠู„", "๐ŸŒฟ ุชูˆูƒู„ุช ุนู„ู‰ ุงู„ู„ู‡", "๐ŸŒธ ุฑุจ ุงุบูุฑ ู„ูŠ ูˆู„ูˆุงู„ุฏูŠ",
"โœจ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ูŠ ู…ู† ุงู„ุตุงู„ุญูŠู†", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงู‡ุฏู†ูŠ", "๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุซุจุชู†ูŠ",
"๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ูŠ ุงู„ุฌู†ุฉ", "๐ŸŒธ ุงู„ู„ู‡ู… ุฃุฌุฑู†ูŠ ู…ู† ุงู„ู†ุงุฑ", "โœจ ูŠุง ุฑุจ", "๐Ÿ“ฟ ูŠุง ุงู„ู„ู‡",
"๐Ÿ•Š๏ธ ูŠุง ุญูŠ ูŠุง ู‚ูŠูˆู… ุจุฑุญู…ุชูƒ ุฃุณุชุบูŠุซ", "๐ŸŒฟ ุงู„ู„ู‡ู… ุฅู†ูŠ ุฃุณุฃู„ูƒ ุงู„ุนุงููŠุฉ",
"๐ŸŒธ ุงู„ู„ู‡ู… ุฅู†ูŠ ุฃุณุฃู„ูƒ ุงู„ู‡ุฏู‰ ูˆุงู„ุชู‚ู‰", "โœจ ุงู„ู„ู‡ู… ุฅู†ูŠ ุฃุนูˆุฐ ุจูƒ ู…ู† ุงู„ู‡ู… ูˆุงู„ุญุฒู†",
"๐Ÿ“ฟ ุงู„ู„ู‡ู… ุฅู†ูŠ ุฃุนูˆุฐ ุจูƒ ู…ู† ุงู„ุนุฌุฒ ูˆุงู„ูƒุณู„", "๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุฅู†ูŠ ุฃุนูˆุฐ ุจูƒ ู…ู† ุงู„ุฌุจู† ูˆุงู„ุจุฎู„",
"๐ŸŒฟ ุงู„ู„ู‡ู… ุฅู†ูŠ ุฃุนูˆุฐ ุจูƒ ู…ู† ุบู„ุจุฉ ุงู„ุฏูŠู† ูˆู‚ู‡ุฑ ุงู„ุฑุฌุงู„", "๐ŸŒธ ุงู„ู„ู‡ู… ุงุฌุนู„ ุงู„ู‚ุฑุขู† ุฑุจูŠุน ู‚ู„ุจูŠ",
"โœจ ุงู„ู„ู‡ู… ู†ูˆุฑ ู‚ู„ุจูŠ", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุทู‡ุฑ ู‚ู„ุจูŠ", "๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุฃุตู„ุญ ุญุงู„ูŠ",
"๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ูŠ ู…ู† ุงู„ุฐุงูƒุฑูŠู†", "๐ŸŒธ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ูŠ ู…ู† ุงู„ุดุงูƒุฑูŠู†",
"โœจ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ูŠ ู…ู† ุงู„ุตุงุจุฑูŠู†", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ูŠ ู…ู† ุงู„ุชูˆุงุจูŠู†",
"๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ูŠ ู…ู† ุงู„ู…ุชู‚ูŠู†", "๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ูŠ ู…ู† ุงู„ู…ุญุณู†ูŠู†",
"๐ŸŒธ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ูŠ ุงู„ุฅุฎู„ุงุต", "โœจ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ูŠ ุงู„ุตุฏู‚", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ูŠ ุญุณู† ุงู„ุฎุงุชู…ุฉ",
"๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฌุนู„ ู‚ุจุฑูŠ ุฑูˆุถุฉ ู…ู† ุฑูŠุงุถ ุงู„ุฌู†ุฉ", "๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ูŠ ู…ู† ุฃู‡ู„ ุงู„ุฌู†ุฉ",
"๐ŸŒธ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ูŠ ุงู„ูุฑุฏูˆุณ ุงู„ุฃุนู„ู‰", "โœจ ุงู„ู„ู‡ู… ู„ุง ุชุญุฑู…ู†ูŠ ู…ู† ุฑุญู…ุชูƒ",
"๐Ÿ“ฟ ุงู„ู„ู‡ู… ู„ุง ุชูƒู„ู†ูŠ ุฅู„ู‰ ู†ูุณูŠ", "๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฑุญู… ู…ูˆุชุงู†ุง", "๐ŸŒฟ ุงู„ู„ู‡ู… ุงุดู ู…ุฑุถุงู†ุง",
"๐ŸŒธ ุงู„ู„ู‡ู… ูุฑุฌ ู‡ู…ูˆู…ู†ุง", "โœจ ุงู„ู„ู‡ู… ุงู‚ุถ ุฏูŠูˆู†ู†ุง", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ูˆุณุน ุฑุฒู‚ู†ุง",
"๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุจุงุฑูƒ ู„ู†ุง", "๐ŸŒฟ ุงู„ู„ู‡ู… ุงุญูุธู†ุง", "๐ŸŒธ ุงู„ู„ู‡ู… ุงู†ุตุฑู†ุง",
"โœจ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุนุจุงุฏูƒ ุงู„ุตุงู„ุญูŠู†", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุฑุถุงูƒ",
"๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุฃู‡ู„ ุงู„ุฐูƒุฑ", "๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุญุจูƒ", "๐ŸŒธ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุญุจ ู†ุจูŠูƒ",
"โœจ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ู…ุชูˆูƒู„ูŠู†", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุงู„ุตุจุฑ", "๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุงู„ูŠู‚ูŠู†",
"๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ุฐุงูƒุฑูŠู† ุงู„ู„ู‡ ูƒุซูŠุฑุง", "๐ŸŒธ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ู‚ุงู†ุชูŠู†",
"โœจ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุญุณู† ุงู„ุธู† ุจูƒ", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ู…ู‚ุจูˆู„ูŠู†",
"๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ู„ุฐุฉ ุงู„ู†ุธุฑ ุฅู„ู‰ ูˆุฌู‡ูƒ", "๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ูุงุฆุฒูŠู†",
"๐ŸŒธ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุฃู‡ู„ ุงู„ูุฑุฏูˆุณ", "โœจ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุนุชู‚ุงุฆูƒ ู…ู† ุงู„ู†ุงุฑ",
"๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ู…ุณุชุบูุฑูŠู†", "๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ุฑุงุฌุนูŠู† ุฅู„ูŠูƒ",
"๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ู…ู†ูŠุจูŠู†", "๐ŸŒธ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุงู„ุชูˆุจุฉ ุงู„ู†ุตูˆุญ",
"โœจ ุงู„ู„ู‡ู… ุชู‚ุจู„ ู…ู†ุง", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุบูุฑ ู„ู†ุง", "๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฑุญู…ู†ุง", "๐ŸŒฟ ุงู„ู„ู‡ู… ุชุจ ุนู„ูŠู†ุง",
"๐ŸŒธ ุงู„ู„ู‡ู… ุงู‡ุฏู†ุง", "โœจ ุงู„ู„ู‡ู… ุงุญูุธู†ุง ู…ู† ูƒู„ ุณูˆุก", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ุตุงู„ุญูŠู†",
"๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุงู„ุฌู†ุฉ ุจุบูŠุฑ ุญุณุงุจ", "๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุฃู‡ู„ ุงู„ู‚ุฑุขู†",
"๐ŸŒธ ุงู„ู„ู‡ู… ุงุฌุนู„ ุงู„ู‚ุฑุขู† ุดููŠุนุงู‹ ู„ู†ุง", "โœจ ุงู„ู„ู‡ู… ุงุฌุนู„ ุงู„ู‚ุฑุขู† ุญุฌุฉ ู„ู†ุง",
"๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ุฐูŠู† ูŠุณุชู…ุนูˆู† ุงู„ู‚ูˆู„ ููŠุชุจุนูˆู† ุฃุญุณู†ู‡",
"๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุฃูˆู„ูŠ ุงู„ุฃู„ุจุงุจ", "๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุงู„ุนู„ู… ุงู„ู†ุงูุน",
"๐ŸŒธ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุงู„ุนู…ู„ ุงู„ุตุงู„ุญ", "โœจ ุงู„ู„ู‡ู… ุงุฑุฒู‚ู†ุง ุงู„ุฅูŠู…ุงู† ุงู„ูƒุงู…ู„",
"๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุฃู‡ู„ ุงู„ุชู‚ูˆู‰", "๐Ÿ•Š๏ธ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ุตุงุฏู‚ูŠู†",
"๐ŸŒฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ู…ุฎู„ุตูŠู†", "๐ŸŒธ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุนุจุงุฏูƒ ุงู„ู…ู‚ุฑุจูŠู†",
"โœจ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ุฐุงูƒุฑูŠู† ุงู„ุดุงูƒุฑูŠู†", "๐Ÿ“ฟ ุงู„ู„ู‡ู… ุงุฌุนู„ู†ุง ู…ู† ุงู„ุตุงุจุฑูŠู† ุงู„ู…ุญุชุณุจูŠู†"
]
# =======================================================
# ู‚ุงุฆู…ุฉ 30 ู‚ุงุฑุฆ (ุจุฏูˆู† ุงุฎุชุตุงุฑ)
# =======================================================
RECITERS = [
{"name": "ุฅุฐุงุนุฉ ุชู„ุงูˆุงุช ู…ู†ูˆุนุฉ", "desc": "ุจุซ ู…ุจุงุดุฑ ู„ุชู„ุงูˆุงุช ู…ุฎุชุงุฑุฉ", "url": "https://qurango.net/radio/tarateel"},
{"name": "ุนุจุฏุงู„ุจุงุณุท ุนุจุฏุงู„ุตู…ุฏ", "desc": "ุชู„ุงูˆุฉ ู…ุฌูˆุฏุฉ ุจุตูˆุช ุฎุงุดุน", "url": "https://qurango.net/radio/abdulbasit_abdulsamad_mjawwad"},
{"name": "ู…ุดุงุฑูŠ ุงู„ุนูุงุณูŠ", "desc": "ุชู„ุงูˆุฉ ู‡ุงุฏุฆุฉ ูˆู…ุฑูŠุญุฉ", "url": "https://qurango.net/radio/mishary_alafasi"},
{"name": "ูŠุงุณุฑ ุงู„ุฏูˆุณุฑูŠ", "desc": "ุชู„ุงูˆุงุช ู…ู…ูŠุฒุฉ ู…ู† ุงู„ุญุฑู…", "url": "https://qurango.net/radio/yasser_aldosari"},
{"name": "ู…ุงู‡ุฑ ุงู„ู…ุนูŠู‚ู„ูŠ", "desc": "ุชู„ุงูˆุฉ ุนุฐุจุฉ ูˆุดู‡ูŠุฑุฉ", "url": "https://qurango.net/radio/maher_al_muaiqly"},
{"name": "ุฃุญู…ุฏ ุจู† ุนู„ูŠ ุงู„ุนุฌู…ูŠ", "desc": "ุชู„ุงูˆุฉ ุฎุงุดุนุฉ", "url": "https://qurango.net/radio/ahmad_alajmy"},
{"name": "ุณุนุฏ ุงู„ุบุงู…ุฏูŠ", "desc": "ุชู„ุงูˆุฉ ู…ุฑูŠุญุฉ ู„ู„ู‚ู„ุจ", "url": "https://qurango.net/radio/saad_alghamidi"},
{"name": "ุณุนูˆุฏ ุงู„ุดุฑูŠู…", "desc": "ู…ู† ุชู„ุงูˆุงุช ุงู„ุญุฑู… ุงู„ู…ูƒูŠ", "url": "https://qurango.net/radio/saud_alshuraim"},
{"name": "ุนุจุฏุงู„ุฑุญู…ู† ุงู„ุณุฏูŠุณ", "desc": "ุชู„ุงูˆุฉ ุงู„ุญุฑู… ุงู„ู…ูƒูŠ ุงู„ุดุฑูŠู", "url": "https://qurango.net/radio/abdulrahman_alsudaes"},
{"name": "ู…ุญู…ูˆุฏ ุฎู„ูŠู„ ุงู„ุญุตุฑูŠ", "desc": "ุชู„ุงูˆุฉ ู…ุฑุชู„ุฉ ุฏู‚ูŠู‚ุฉ", "url": "https://qurango.net/radio/mahmoud_khalil_alhussary"},
{"name": "ุนู„ูŠ ุนุจุฏุงู„ู„ู‡ ุฌุงุจุฑ", "desc": "ุชู„ุงูˆุฉ ู…ู…ูŠุฒุฉ", "url": "https://qurango.net/radio/ali_jaber"},
{"name": "ู…ุญู…ุฏ ุฃูŠูˆุจ", "desc": "ุชู„ุงูˆุฉ ุญุฌุงุฒูŠุฉ", "url": "https://qurango.net/radio/mohammed_ayyub"},
{"name": "ู…ุญู…ุฏ ุตุฏูŠู‚ ุงู„ู…ู†ุดุงูˆูŠ", "desc": "ุชู„ุงูˆุฉ ุฎุงุดุนุฉ ุฌุฏุงู‹", "url": "https://qurango.net/radio/mohammed_siddiq_alminshawi"},
{"name": "ุฃุจูˆุจูƒุฑ ุงู„ุดุงุทุฑูŠ", "desc": "ุชู„ุงูˆุฉ ู‡ุงุฏุฆุฉ", "url": "https://qurango.net/radio/abubakr_alshatri"},
{"name": "ุนุจุฏุงู„ู„ู‡ ุจุตูุฑ", "desc": "ุชู„ุงูˆุฉ ุนุฐุจุฉ", "url": "https://qurango.net/radio/abdullah_basfer"},
{"name": "ุนุจุฏุงู„ู…ุญุณู† ุงู„ู‚ุงุณู…", "desc": "ุฅู…ุงู… ุงู„ู…ุณุฌุฏ ุงู„ู†ุจูˆูŠ", "url": "https://qurango.net/radio/abdulmohsin_alqasim"},
{"name": "ุนุจุฏุงู„ูˆุฏูˆุฏ ุญู†ูŠู", "desc": "ุชู„ุงูˆุฉ ุฑุงุฆุนุฉ", "url": "https://qurango.net/radio/abdulwadood_haneef"},
{"name": "ุนู„ูŠ ุนุจุฏุงู„ุฑุญู…ู† ุงู„ุญุฐูŠููŠ", "desc": "ู…ู† ุชู„ุงูˆุงุช ุงู„ู…ุณุฌุฏ ุงู„ู†ุจูˆูŠ", "url": "https://qurango.net/radio/ali_alhuthaifi"},
{"name": "ูุงุฑุณ ุนุจุงุฏ", "desc": "ุชู„ุงูˆุฉ ู…ุคุซุฑุฉ", "url": "https://qurango.net/radio/fares_abbad"},
{"name": "ู…ุญู…ุฏ ุฌุจุฑูŠู„", "desc": "ุชู„ุงูˆุฉ ู…ุดู‡ูˆุฑุฉ", "url": "https://qurango.net/radio/mohammed_jibreel"},
{"name": "ู…ุญู…ุฏ ุงู„ุทุจู„ุงูˆูŠ", "desc": "ู…ู† ูƒุจุงุฑ ุงู„ู‚ุฑุงุก", "url": "https://qurango.net/radio/mohammad_altablaway"},
{"name": "ู…ุญู…ูˆุฏ ุนู„ูŠ ุงู„ุจู†ุง", "desc": "ุชู„ุงูˆุฉ ูƒู„ุงุณูŠูƒูŠุฉ", "url": "https://qurango.net/radio/mahmoud_ali__albanna"},
{"name": "ู…ุตุทูู‰ ุฅุณู…ุงุนูŠู„", "desc": "ุชู„ุงูˆุฉ ู…ุฌูˆุฏุฉ", "url": "https://qurango.net/radio/mustafa_ismail"},
{"name": "ู‡ุงู†ูŠ ุงู„ุฑูุงุนูŠ", "desc": "ุชู„ุงูˆุฉ ุจูƒุงุฆูŠุฉ", "url": "https://qurango.net/radio/hani_arrifai"},
{"name": "ูŠุญูŠู‰ ุญูˆุง", "desc": "ุชู„ุงูˆุฉ ู‡ุงุฏุฆุฉ", "url": "https://qurango.net/radio/yahya_hawwa"},
{"name": "ุฎุงู„ุฏ ุงู„ู‚ุญุทุงู†ูŠ", "desc": "ุชู„ุงูˆุฉ ุฎุงุดุนุฉ", "url": "https://qurango.net/radio/khalid_alqahtani"},
{"name": "ุตู„ุงุญ ุงู„ุจุฏูŠุฑ", "desc": "ุฅู…ุงู… ุงู„ู…ุณุฌุฏ ุงู„ู†ุจูˆูŠ", "url": "https://qurango.net/radio/salah_albudair"},
{"name": "ุตู„ุงุญ ุจูˆ ุฎุงุทุฑ", "desc": "ุชู„ุงูˆุฉ ู†ุฏูŠุฉ", "url": "https://qurango.net/radio/salah_bukhatir"},
{"name": "ุนุจุฏุงู„ุฑุดูŠุฏ ุตูˆููŠ", "desc": "ุชู„ุงูˆุฉ ู…ู…ูŠุฒุฉ ุจุฑูˆุงูŠุงุช", "url": "https://qurango.net/radio/abdulrasheed_soufi"},
{"name": "ุนุจุฏุงู„ู„ู‡ ุนูˆุงุฏ ุงู„ุฌู‡ู†ูŠ", "desc": "ุฅู…ุงู… ุงู„ุญุฑู… ุงู„ู…ูƒูŠ", "url": "https://qurango.net/radio/abdullah_aljuhani"}
]
# --- ู…ุชุบูŠุฑุงุช ุงู„ุชุญูƒู… ุจุงู„ุจุซ ---
current_reciter_index = 0
current_volume = 1.0
# ุฅุนุฏุงุฏุงุช ุฃูƒุซุฑ ุฃู…ุงู†ุงู‹ ู„ุชุฌู†ุจ ุญุธุฑ IP ู…ู† ุงู„ุณูŠุฑูุฑุงุช ุงู„ุตูˆุชูŠุฉ
FFMPEG_OPTIONS = {
'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5',
'options': '-vn -sn -dn -bufsize 500k -max_muxing_queue_size 1024'
}
# =======================================================
# ุชุฌู‡ูŠุฒ ูˆุงุฌู‡ุฉ ุงู„ุฃุฒุฑุงุฑ (Control Panel)
# =======================================================
class ReciterSelect(Select):
def __init__(self):
options = []
for i, r in enumerate(RECITERS[:25]):
options.append(discord.SelectOption(label=r['name'], description=r['desc'][:50], value=str(i)))
super().__init__(placeholder="ุงุฎุชุฑ ุงู„ู‚ุงุฑุฆ ู…ู† ุงู„ู‚ุงุฆู…ุฉ ุงู„ุณุฑูŠุนุฉ...", min_values=1, max_values=1, options=options, custom_id="select_reciter")
async def callback(self, interaction: discord.Interaction):
role = interaction.guild.get_role(OWNER_ROLE_ID)
if role not in interaction.user.roles:
return await interaction.response.send_message("โŒ ู„ุง ุชู…ู„ูƒ ุตู„ุงุญูŠุฉ.", ephemeral=True)
global current_reciter_index
current_reciter_index = int(self.values[0])
vc = interaction.guild.voice_client
if vc: await play_current_reciter(vc)
try:
await interaction.response.send_message(f"๐ŸŽ™๏ธ ุชู… ุงู„ุชุบูŠูŠุฑ ุฅู„ู‰: {RECITERS[current_reciter_index]['name']}", ephemeral=True)
await log_event(interaction.guild, f"๐ŸŽ™๏ธ **{interaction.user.name}** ู‚ุงู… ุจุชุบูŠูŠุฑ ุงู„ู‚ุงุฑุฆ ุฅู„ู‰: {RECITERS[current_reciter_index]['name']}")
except: pass
class ControlPanelView(View):
def __init__(self):
super().__init__(timeout=None)
self.add_item(ReciterSelect())
async def check_owner(self, interaction: discord.Interaction):
role = interaction.guild.get_role(OWNER_ROLE_ID)
if role and role in interaction.user.roles:
return True
try:
await interaction.response.send_message("โŒ ุนุฐุฑุงู‹ุŒ ู„ุง ุชู…ู„ูƒ ุงู„ุตู„ุงุญูŠุฉ (ุฑุชุจุฉ ุงู„ู…ุงู„ูƒ ุงู„ู…ุทู„ูˆุจุฉ).", ephemeral=True)
except: pass
return False
@discord.ui.button(label="โธ๏ธ / โ–ถ๏ธ ุฅูŠู‚ุงู ูˆุชุดุบูŠู„", style=discord.ButtonStyle.primary, custom_id="btn_toggle")
async def toggle_btn(self, interaction: discord.Interaction, button: Button):
if not await self.check_owner(interaction): return
vc = interaction.guild.voice_client
try:
if vc:
if vc.is_paused():
vc.resume()
await interaction.response.send_message("โ–ถ๏ธ ุชู… ุงุณุชุฆู†ุงู ุงู„ุจุซ.", ephemeral=True)
await log_event(interaction.guild, f"โ–ถ๏ธ **{interaction.user.name}** ู‚ุงู… ุจุงุณุชุฆู†ุงู ุงู„ุจุซ.")
elif vc.is_playing():
vc.pause()
await interaction.response.send_message("โธ๏ธ ุชู… ุฅูŠู‚ุงู ุงู„ุจุซ ู…ุคู‚ุชุงู‹.", ephemeral=True)
await log_event(interaction.guild, f"โธ๏ธ **{interaction.user.name}** ู‚ุงู… ุจุฅูŠู‚ุงู ุงู„ุจุซ ูŠุฏูˆูŠุงู‹.")
else:
await play_current_reciter(vc)
await interaction.response.send_message("โ–ถ๏ธ ุชู… ุชุดุบูŠู„ ุงู„ุจุซ.", ephemeral=True)
else:
await interaction.response.send_message("โŒ ุงู„ุจูˆุช ุบูŠุฑ ู…ุชุตู„.", ephemeral=True)
except: pass
@discord.ui.button(label="โญ๏ธ ุงู„ุชุงู„ูŠ", style=discord.ButtonStyle.secondary, custom_id="btn_next")
async def next_btn(self, interaction: discord.Interaction, button: Button):
if not await self.check_owner(interaction): return
global current_reciter_index
current_reciter_index = (current_reciter_index + 1) % len(RECITERS)
vc = interaction.guild.voice_client
if vc: await play_current_reciter(vc)
try:
await interaction.response.send_message(f"โญ๏ธ ุชู… ุงู„ุงู†ุชู‚ุงู„ ุฅู„ู‰: {RECITERS[current_reciter_index]['name']}", ephemeral=True)
await log_event(interaction.guild, f"โญ๏ธ **{interaction.user.name}** ุงู†ุชู‚ู„ ู„ู„ู‚ุงุฑุฆ: {RECITERS[current_reciter_index]['name']}")
except: pass
@discord.ui.button(label="โฎ๏ธ ุงู„ุณุงุจู‚", style=discord.ButtonStyle.secondary, custom_id="btn_prev")
async def prev_btn(self, interaction: discord.Interaction, button: Button):
if not await self.check_owner(interaction): return
global current_reciter_index
current_reciter_index = (current_reciter_index - 1) % len(RECITERS)
vc = interaction.guild.voice_client
if vc: await play_current_reciter(vc)
try:
await interaction.response.send_message(f"โฎ๏ธ ุชู… ุงู„ุฑุฌูˆุน ุฅู„ู‰: {RECITERS[current_reciter_index]['name']}", ephemeral=True)
await log_event(interaction.guild, f"โฎ๏ธ **{interaction.user.name}** ุฑุฌุน ู„ู„ู‚ุงุฑุฆ: {RECITERS[current_reciter_index]['name']}")
except: pass
class QuranBot(commands.Bot):
def __init__(self):
intents = discord.Intents.default()
intents.message_content = True
intents.voice_states = True
intents.guilds = True
super().__init__(command_prefix="!", intents=intents)
async def setup_hook(self):
self.add_view(ControlPanelView())
await self.tree.sync()
print("โœ… ุชู… ู…ุฒุงู…ู†ุฉ ุงู„ุฃูˆุงู…ุฑ ูˆุงู„ุฃุฒุฑุงุฑ ุจู†ุฌุงุญ.")
bot = QuranBot()
# =======================================================
# ุฏูˆุงู„ ู…ุณุงุนุฏุฉ ูˆุญู…ุงูŠุฉ ู…ู† ุงู„ุญุธุฑ
# =======================================================
async def log_event(guild: discord.Guild, message: str):
log_channel = discord.utils.get(guild.text_channels, name="๐Ÿ“œ-ุณุฌู„ุงุช-ุงู„ุจูˆุช")
time_now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if log_channel:
try:
await log_channel.send(f"`[{time_now}]` {message}")
except: pass # ู…ู†ุน ุชูˆู‚ู ุงู„ุจูˆุช ุฅุฐุง ุฑูุถ ุฏูŠุณูƒูˆุฑุฏ ุฅุฑุณุงู„ ุงู„ุฑุณุงู„ุฉ ุจุณุจุจ Rate Limit
print(f"[{time_now}] {message}")
def is_owner_and_in_control():
async def predicate(interaction: discord.Interaction):
if not interaction.guild:
try: await interaction.response.send_message("โŒ ู‡ุฐุง ุงู„ุฃู…ุฑ ู…ุฎุตุต ู„ู„ุงุณุชุฎุฏุงู… ุฏุงุฎู„ ุงู„ุณูŠุฑูุฑ ูู‚ุท.", ephemeral=True)
except: pass
return False
if interaction.channel.name != "๐Ÿ› ๏ธ ุบุฑูุฉ ุงู„ุชุญูƒู… (ู„ู„ู…ุงู„ูƒ)":
try: await interaction.response.send_message("โŒ ุนุฐุฑุงู‹ุŒ ู„ุง ูŠู…ูƒู†ูƒ ุงุณุชุฎุฏุงู… ุงู„ุฃูˆุงู…ุฑ ุฅู„ุง ุฏุงุฎู„ ๐Ÿ› ๏ธ ุบุฑูุฉ ุงู„ุชุญูƒู….", ephemeral=True)
except: pass
return False
role = interaction.guild.get_role(OWNER_ROLE_ID)
if role and role in interaction.user.roles:
return True
try: await interaction.response.send_message("โŒ ุนุฐุฑุงู‹ุŒ ู„ุง ุชู…ู„ูƒ ุงู„ุตู„ุงุญูŠุฉ (ุฑุชุจุฉ ุงู„ู…ุงู„ูƒ ุงู„ู…ุทู„ูˆุจุฉ).", ephemeral=True)
except: pass
return False
return app_commands.check(predicate)
async def play_current_reciter(vc: discord.VoiceClient):
try:
if vc.is_playing() or vc.is_paused():
vc.stop()
await asyncio.sleep(1) # ุชุฃุฎูŠุฑ ุจุณูŠุท ู„ุญู…ุงูŠุฉ ุงู„ู€ API ู…ู† ุถุบุท ุงู„ุทู„ุจุงุช
reciter = RECITERS[current_reciter_index]
audio_source = discord.FFmpegPCMAudio(reciter["url"], **FFMPEG_OPTIONS)
vc.play(discord.PCMVolumeTransformer(audio_source, volume=current_volume))
except Exception as e:
print(f"โš ๏ธ ุฎุทุฃ ุฃุซู†ุงุก ุงู„ุชุดุบูŠู„ (ุชู… ุชุฌุงูˆุฒู‡): {e}")
# =======================================================
# ู‡ู†ุฏุณุฉ ุงู„ู‚ู†ูˆุงุช ูˆุงู„ุฃุญุฏุงุซ
# =======================================================
@bot.event
async def on_ready():
# ุญุงู„ุฉ ู…ุณุชู‚ุฑุฉ ูˆุขู…ู†ุฉ ุชุธู‡ุฑ ู„ู„ู…ุณุชุฎุฏู…ูŠู†
await bot.change_presence(status=discord.Status.online, activity=discord.Activity(type=discord.ActivityType.listening, name="ุงู„ู‚ุฑุขู† ุงู„ูƒุฑูŠู… 24/7 ๐ŸŽง"))
print(f"๐Ÿค– ุงู„ุจูˆุช {bot.user} ู…ุชุตู„ ุจุดุจูƒุฉ ุฏูŠุณูƒูˆุฑุฏ ุจู†ุฌุงุญ ูˆู‡ูˆ ุงู„ุขู† (Online).")
# ูุญุต ู‡ุงุฏุฆ ู„ู„ุณูŠุฑูุฑุงุช
for guild in bot.guilds:
if guild.id != TARGET_GUILD_ID:
print(f"๐Ÿ‘ข ุฌุงุฑูŠ ู…ุบุงุฏุฑุฉ ุณูŠุฑูุฑ ุบุฑูŠุจ ุจู‡ุฏูˆุก: {guild.name}")
await asyncio.sleep(2) # ุชุฃุฎูŠุฑ ู„ู…ู†ุน ุงู„ุทุฑุฏ ุงู„ู…ุชุนุฏุฏ ุงู„ุณุฑูŠุน
try: await guild.leave()
except: pass
else:
await check_and_create_channels(guild)
await log_event(guild, "๐Ÿš€ **ุชู… ุฅู‚ู„ุงุน ุงู„ู†ุธุงู… ูˆุงู„ุจูˆุช ู…ุชุตู„ ุงู„ุขู†.**")
# ุชุดุบูŠู„ ู†ุจุถ ุงู„ู‚ู„ุจ (ูุญุต ูƒู„ 5 ุฏู‚ุงุฆู‚)
if not heartbeat_task.is_running():
heartbeat_task.start()
@bot.event
async def on_guild_join(guild):
print(f"๐Ÿ“ฅ ุงู„ุจูˆุช ุฏุฎู„ ุณูŠุฑูุฑ ุฌุฏูŠุฏ: {guild.name}")
await asyncio.sleep(2) # ุญู…ุงูŠุฉ API ุฏูŠุณูƒูˆุฑุฏ
if guild.id != TARGET_GUILD_ID:
try: await guild.leave()
except: pass
else:
await check_and_create_channels(guild)
await log_event(guild, "๐Ÿš€ **ุชู… ุฅุถุงูุฉ ุงู„ุจูˆุช ู„ู„ุณูŠุฑูุฑ ุงู„ุตุญูŠุญ ูˆุจุฏุก ุงู„ุชุดุบูŠู„!**")
async def check_and_create_channels(guild):
category_name = "ุฅุฐุงุนุฉ ุงู„ู‚ุฑุขู† ุงู„ูƒุฑูŠู…"
broadcast_vc_name = "๐ŸŽง ุงุณุชู…ุงุน ุงู„ู‚ุฑุขู† (ุจุซ ุนุงู…)"
control_vc_name = "๐Ÿ› ๏ธ ุบุฑูุฉ ุงู„ุชุญูƒู… (ู„ู„ู…ุงู„ูƒ)"
log_channel_name = "๐Ÿ“œ-ุณุฌู„ุงุช-ุงู„ุจูˆุช"
category = discord.utils.get(guild.categories, name=category_name)
broadcast_vc = discord.utils.get(guild.voice_channels, name=broadcast_vc_name)
control_vc = discord.utils.get(guild.voice_channels, name=control_vc_name)
log_tc = discord.utils.get(guild.text_channels, name=log_channel_name)
owner_role = guild.get_role(OWNER_ROLE_ID)
try:
if not category:
category = await guild.create_category(category_name)
await asyncio.sleep(1)
if not log_tc:
overwrites_log = {
guild.default_role: discord.PermissionOverwrite(view_channel=False),
bot.user: discord.PermissionOverwrite(view_channel=True, send_messages=True, read_message_history=True)
}
if owner_role: overwrites_log[owner_role] = discord.PermissionOverwrite(view_channel=True, read_message_history=True)
log_tc = await guild.create_text_channel(log_channel_name, category=category, overwrites=overwrites_log)
await asyncio.sleep(1)
if not broadcast_vc:
overwrites_broadcast = {
guild.default_role: discord.PermissionOverwrite(
view_channel=True, connect=True, read_message_history=True,
speak=False, send_messages=False, add_reactions=False, stream=False
),
bot.user: discord.PermissionOverwrite(connect=True, speak=True, send_messages=True, administrator=True)
}
broadcast_vc = await guild.create_voice_channel(broadcast_vc_name, category=category, overwrites=overwrites_broadcast)
await asyncio.sleep(1)
if not control_vc:
overwrites_control = {
guild.default_role: discord.PermissionOverwrite(view_channel=False, connect=False),
bot.user: discord.PermissionOverwrite(view_channel=True, connect=True, send_messages=True)
}
if owner_role: overwrites_control[owner_role] = discord.PermissionOverwrite(view_channel=True, connect=True, send_messages=True)
control_vc = await guild.create_voice_channel(control_vc_name, category=category, overwrites=overwrites_control, user_limit=99)
embed = discord.Embed(
title="๐ŸŽ›๏ธ ู„ูˆุญุฉ ุชุญูƒู… ุงู„ุฅุฐุงุนุฉ ุงู„ุฐูƒูŠุฉ",
description="ุงุณุชุฎุฏู… ุงู„ุฃุฒุฑุงุฑ ุฃุฏู†ุงู‡ ู„ู„ุชุญูƒู… ุงู„ุณุฑูŠุน ููŠ ุงู„ุจุซุŒ ุฃูˆ ุงุฎุชุฑ ุงู„ู‚ุงุฑุฆ ู…ู† ุงู„ู‚ุงุฆู…ุฉ ุงู„ู…ู†ุณุฏู„ุฉ.\n\n*ู…ู„ุงุญุธุฉ: ูŠู…ูƒู†ูƒ ุฃูŠุถุงู‹ ุงุณุชุฎุฏุงู… ุงู„ุฃูˆุงู…ุฑ ู…ุซู„ `/volume` ู‡ู†ุง ูู‚ุท.*",
color=discord.Color.dark_theme()
)
embed.set_footer(text="SaaS Pro Dashboard")
await control_vc.send(embed=embed, view=ControlPanelView())
# ุงุชุตุงู„ ุงู„ุจูˆุช
if not guild.voice_client:
vc = await broadcast_vc.connect()
await asyncio.sleep(2) # ุงุณุชู‚ุฑุงุฑ ุงู„ุงุชุตุงู„
await play_current_reciter(vc)
human_members = sum(1 for m in broadcast_vc.members if not m.bot)
if human_members == 0:
vc.pause()
await log_event(guild, "โธ๏ธ ุงู„ู‚ู†ุงุฉ ูุงุฑุบุฉุŒ ุชู… ูˆุถุน ุงู„ุจุซ ููŠ ูˆุถุน ุงู„ุงุณุชุนุฏุงุฏ (ู„ุชุฌู†ุจ ุถุบุท ุงู„ุดุจูƒุฉ).")
else:
await log_event(guild, "โ–ถ๏ธ ุชู… ุงู„ุจุฏุก ุจุงู„ุจุซ ู„ูˆุฌูˆุฏ ู…ุณุชู…ุนูŠู† ููŠ ุงู„ู‚ู†ุงุฉ.")
except Exception as e:
print(f"โš ๏ธ ุชุญุฐูŠุฑ ุฃุซู†ุงุก ุฅู†ุดุงุก ุงู„ู‚ู†ูˆุงุช (ู‚ุฏ ูŠูƒูˆู† ุจุณุจุจ ุถุบุท ุงู„ุทู„ุจุงุช): {e}")
@bot.event
async def on_voice_state_update(member, before, after):
if member.bot: return
guild = member.guild
if guild.id != TARGET_GUILD_ID: return
bot_vc = guild.voice_client
if not bot_vc: return
try:
# ุญุงู„ุฉ ุฏุฎูˆู„ ุนุถูˆ
if after.channel and after.channel.id == bot_vc.channel.id:
if bot_vc.is_paused():
bot_vc.resume()
await log_event(guild, f"โ–ถ๏ธ ุงุณุชุฆู†ุงู ุงู„ุจุซ ุงู„ุชู„ู‚ุงุฆูŠ ู„ุฏุฎูˆู„ ู…ุณุชู…ุน.")
embed = discord.Embed(
title="ุฃู‡ู„ุงู‹ ุจูƒ ููŠ ู…ุฌู„ุณ ุงู„ุฐูƒุฑ ๐Ÿ•Š๏ธ",
description=random.choice(REMINDERS),
color=discord.Color.gold()
)
embed.set_footer(text=f"ุงู„ู‚ุงุฑุฆ ุงู„ุญุงู„ูŠ: {RECITERS[current_reciter_index]['name']}")
try:
await after.channel.send(content=f"ู…ุฑุญุจุงู‹ ุจูƒ {member.mention}", embed=embed, delete_after=60)
except: pass
# ุญุงู„ุฉ ุฎุฑูˆุฌ ุนุถูˆ
elif before.channel and before.channel.id == bot_vc.channel.id:
human_members = sum(1 for m in before.channel.members if not m.bot)
if human_members == 0 and bot_vc.is_playing():
bot_vc.pause()
except: pass # ู…ู†ุน ุฃูŠ ุฎุทุฃ ู…ูุงุฌุฆ ู…ู† ุฅูŠู‚ุงู ุงู„ุจูˆุช
# =======================================================
# ู…ู‡ู…ุฉ ุงู„ูุญุต ุงู„ู‡ุงุฏุฆ (Heartbeat)
# =======================================================
@tasks.loop(minutes=5)
async def heartbeat_task():
"""ู‡ุฐู‡ ุงู„ุฏุงู„ุฉ ุชูุญุต ุงู„ุจูˆุช ูƒู„ 5 ุฏู‚ุงุฆู‚ ู„ุถู…ุงู† ุนุฏู… ูุตู„ู‡ ู…ู† ุฏูŠุณูƒูˆุฑุฏ"""
try:
guild = bot.get_guild(TARGET_GUILD_ID)
if guild and guild.voice_client:
human_members = sum(1 for m in guild.voice_client.channel.members if not m.bot)
# ุฅุฐุง ูƒุงู† ู‡ู†ุงูƒ ู†ุงุณ ูˆุงู„ุตูˆุช ู…ุชูˆู‚ู ุจุงู„ุฎุทุฃุŒ ู†ู‚ูˆู… ุจุชุดุบูŠู„ู‡
if human_members > 0 and not guild.voice_client.is_playing() and not guild.voice_client.is_paused():
await play_current_reciter(guild.voice_client)
await log_event(guild, "๐Ÿ”„ ุชู… ุฅุนุงุฏุฉ ุฅู†ุนุงุด ุงู„ุจุซ ุงู„ุชู„ู‚ุงุฆูŠ ุจูˆุงุณุทุฉ ู†ุธุงู… ุงู„ุญู…ุงูŠุฉ (Heartbeat).")
except: pass
# =======================================================
# ุฃูˆุงู…ุฑ ุงู„ุณู„ุงุด (ู…ุญุตูˆุฑุฉ ููŠ ุบุฑูุฉ ุงู„ุชุญูƒู…)
# =======================================================
@bot.tree.command(name="play_radio", description="โ–ถ๏ธ ุชุดุบูŠู„ ุจุซ ุงู„ู‚ุฑุขู† ุฅุฌุจุงุฑูŠุงู‹")
@is_owner_and_in_control()
async def play_radio(interaction: discord.Interaction):
vc = interaction.guild.voice_client
try:
if not vc: return await interaction.response.send_message("โŒ ุงู„ุจูˆุช ุบูŠุฑ ู…ุชุตู„.", ephemeral=True)
if vc.is_paused(): vc.resume()
else: await play_current_reciter(vc)
await interaction.response.send_message(f"โ–ถ๏ธ ุชู… ุงู„ุชุดุบูŠู„: **{RECITERS[current_reciter_index]['name']}**", ephemeral=True)
await log_event(interaction.guild, f"โ–ถ๏ธ ุชู… ุงู„ุชุดุบูŠู„ ุนุจุฑ ุฃู…ุฑ /play_radio")
except: pass
@bot.tree.command(name="stop_radio", description="โน๏ธ ุฅูŠู‚ุงู ุงู„ุจุซ ู…ุคู‚ุชุงู‹")
@is_owner_and_in_control()
async def stop_radio(interaction: discord.Interaction):
vc = interaction.guild.voice_client
try:
if vc and vc.is_playing():
vc.pause()
await interaction.response.send_message("โน๏ธ ุชู… ุงู„ุฅูŠู‚ุงู.", ephemeral=True)
await log_event(interaction.guild, f"โน๏ธ ุชู… ุงู„ุฅูŠู‚ุงู ุนุจุฑ ุฃู…ุฑ /stop_radio")
else:
await interaction.response.send_message("โš ๏ธ ู…ุชูˆู‚ู ุจุงู„ูุนู„.", ephemeral=True)
except: pass
@bot.tree.command(name="volume", description="๐Ÿ”Š ุงู„ุชุญูƒู… ุจุฏุฑุฌุฉ ุงู„ุตูˆุช (ู…ู† 1 ุฅู„ู‰ 100)")
@app_commands.describe(level="ุฏุฑุฌุฉ ุงู„ุตูˆุช ู…ู† 1 ุฅู„ู‰ 100")
@is_owner_and_in_control()
async def set_volume(interaction: discord.Interaction, level: int):
global current_volume
try:
if level < 1 or level > 100:
return await interaction.response.send_message("โŒ ูŠุฑุฌู‰ ุฅุฏุฎุงู„ ุฑู‚ู… ุจูŠู† 1 ูˆ 100.", ephemeral=True)
current_volume = level / 100.0
vc = interaction.guild.voice_client
if vc and vc.source: vc.source.volume = current_volume
await interaction.response.send_message(f"๐Ÿ”Š ุชู… ุชุบูŠูŠุฑ ุฏุฑุฌุฉ ุงู„ุตูˆุช ุฅู„ู‰: **{level}%**", ephemeral=True)
await log_event(interaction.guild, f"๐Ÿ”Š ุชู… ุชุบูŠูŠุฑ ุฏุฑุฌุฉ ุงู„ุตูˆุช ุฅู„ู‰ {level}%")
except: pass
# =======================================================
# ุงู„ุชุดุบูŠู„ ูˆุงู„ู€ Keep Alive
# =======================================================
try:
from keep_alive import keep_alive
keep_alive()
except Exception: pass
if __name__ == "__main__":
TOKEN = os.environ.get("DISCORD_TOKEN")
if TOKEN: bot.run(TOKEN)
else: print("โŒ ุงู„ุชูˆูƒู† ู…ูู‚ูˆุฏ! ูŠุฑุฌู‰ ุงู„ุชุฃูƒุฏ ู…ู† ูˆุถุนู‡ ููŠ ุงู„ู…ุชุบูŠุฑุงุช ุงู„ุจูŠุฆูŠุฉ (Secrets).")