diff --git a/.gitignore b/.gitignore index 1e86a65..0f5e6b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ gifs/ credentials.env -.vscode/ \ No newline at end of file +.vscode/__pycache__/ diff --git a/.vscode/PythonImportHelper-v2-Completion.json b/.vscode/PythonImportHelper-v2-Completion.json new file mode 100644 index 0000000..f58afc9 --- /dev/null +++ b/.vscode/PythonImportHelper-v2-Completion.json @@ -0,0 +1,317 @@ +[ + { + "label": "commands", + "importPath": "discord.ext", + "description": "discord.ext", + "isExtraImport": true, + "detail": "discord.ext", + "documentation": {} + }, + { + "label": "commands", + "importPath": "discord.ext", + "description": "discord.ext", + "isExtraImport": true, + "detail": "discord.ext", + "documentation": {} + }, + { + "label": "commands", + "importPath": "discord.ext", + "description": "discord.ext", + "isExtraImport": true, + "detail": "discord.ext", + "documentation": {} + }, + { + "label": "commands", + "importPath": "discord.ext", + "description": "discord.ext", + "isExtraImport": true, + "detail": "discord.ext", + "documentation": {} + }, + { + "label": "commands", + "importPath": "discord.ext", + "description": "discord.ext", + "isExtraImport": true, + "detail": "discord.ext", + "documentation": {} + }, + { + "label": "commands", + "importPath": "discord.ext", + "description": "discord.ext", + "isExtraImport": true, + "detail": "discord.ext", + "documentation": {} + }, + { + "label": "commands", + "importPath": "discord.ext", + "description": "discord.ext", + "isExtraImport": true, + "detail": "discord.ext", + "documentation": {} + }, + { + "label": "random", + "kind": 6, + "isExtraImport": true, + "importPath": "random", + "description": "random", + "detail": "random", + "documentation": {} + }, + { + "label": "discord", + "kind": 6, + "isExtraImport": true, + "importPath": "discord", + "description": "discord", + "detail": "discord", + "documentation": {} + }, + { + "label": "io", + "kind": 6, + "isExtraImport": true, + "importPath": "io", + "description": "io", + "detail": "io", + "documentation": {} + }, + { + "label": "os", + "kind": 6, + "isExtraImport": true, + "importPath": "os", + "description": "os", + "detail": "os", + "documentation": {} + }, + { + "label": "subprocess", + "kind": 6, + "isExtraImport": true, + "importPath": "subprocess", + "description": "subprocess", + "detail": "subprocess", + "documentation": {} + }, + { + "label": "re", + "kind": 6, + "isExtraImport": true, + "importPath": "re", + "description": "re", + "detail": "re", + "documentation": {} + }, + { + "label": "psutil", + "kind": 6, + "isExtraImport": true, + "importPath": "psutil", + "description": "psutil", + "detail": "psutil", + "documentation": {} + }, + { + "label": "aiohttp", + "kind": 6, + "isExtraImport": true, + "importPath": "aiohttp", + "description": "aiohttp", + "detail": "aiohttp", + "documentation": {} + }, + { + "label": "wavelink", + "kind": 6, + "isExtraImport": true, + "importPath": "wavelink", + "description": "wavelink", + "detail": "wavelink", + "documentation": {} + }, + { + "label": "asyncio", + "kind": 6, + "isExtraImport": true, + "importPath": "asyncio", + "description": "asyncio", + "detail": "asyncio", + "documentation": {} + }, + { + "label": "deque", + "importPath": "collections", + "description": "collections", + "isExtraImport": true, + "detail": "collections", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "logging", + "kind": 6, + "isExtraImport": true, + "importPath": "logging", + "description": "logging", + "detail": "logging", + "documentation": {} + }, + { + "label": "Fun", + "kind": 6, + "importPath": "cogs.chance", + "description": "cogs.chance", + "peekOfCode": "class Fun(commands.Cog):\n def __init__(self, bot):\n self.bot = bot\n # this command lists all the fun commands, not an actualy fun command##\n @commands.command()\n async def fun(self, ctx):\n fun_commands = [f'!{cmd.name}' for cmd in self.get_commands() if cmd.name != 'fun']\n await ctx.reply('\\n'.join(sorted(fun_commands)))\n ######################################################################\n @commands.command()", + "detail": "cogs.chance", + "documentation": {} + }, + { + "label": "Copypasta", + "kind": 6, + "importPath": "cogs.copypasta", + "description": "cogs.copypasta", + "peekOfCode": "class Copypasta(commands.Cog):\n def __init__(self, bot):\n self.bot = bot\n # this command lists all the copypasta commands, not an actualy copypasta command##\n @commands.command()\n async def copypasta(self, ctx):\n pasta_commands = [f'!{cmd.name}' for cmd in self.get_commands() if cmd.name != 'copypasta']\n await ctx.reply('\\n'.join(sorted(pasta_commands)))\n ######################################################################\n @commands.command()", + "detail": "cogs.copypasta", + "documentation": {} + }, + { + "label": "General", + "kind": 6, + "importPath": "cogs.general", + "description": "cogs.general", + "peekOfCode": "class General(commands.Cog):\n def __init__(self, bot):\n self.bot = bot\n @commands.command()\n async def yuuka(self, ctx):\n await ctx.send('kanpeki!')\nasync def setup(bot):\n await bot.add_cog(General(bot))\n@commands.Cog.listener()\nasync def on_command_error(self, ctx, error):", + "detail": "cogs.general", + "documentation": {} + }, + { + "label": "Gifs", + "kind": 6, + "importPath": "cogs.gifs", + "description": "cogs.gifs", + "peekOfCode": "class Gifs(commands.Cog):\n def __init__(self, bot):\n self.bot = bot\n self._gif_names = []\n self._load_gif_commands()\n def _load_gif_commands(self):\n if not os.path.exists('gifs'):\n return\n for filename in os.listdir('gifs'):\n if filename.endswith('.gif'):", + "detail": "cogs.gifs", + "documentation": {} + }, + { + "label": "SysInfo", + "kind": 6, + "importPath": "cogs.sysinfo", + "description": "cogs.sysinfo", + "peekOfCode": "class SysInfo(commands.Cog):\n def __init__(self, bot):\n self.bot = bot\n def strip_ansi(self, text):\n return re.sub(r'\\x1b\\[[0-9;]*[a-zA-Z]|\\[[0-9]+[A-Z]', '', text)\n #this command lists all the sysinfo commands, not an actualy sysinfo command##\n @commands.command()\n async def sysinfo(self, ctx):\n sys_commands = [f'!{cmd.name}' for cmd in self.get_commands()]\n await ctx.reply('\\n'.join(sys_commands))", + "detail": "cogs.sysinfo", + "documentation": {} + }, + { + "label": "GuildState", + "kind": 6, + "importPath": "music.music", + "description": "music.music", + "peekOfCode": "class GuildState:\n def __init__(self):\n self.queue: deque = deque()\n self.history: list = [] # last 10 tracks\n self.loop: int = LOOP_OFF\n self.autoplay: bool = False\n self.current: wavelink.Playable | None = None\n def push_history(self, track: wavelink.Playable):\n self.history.insert(0, track)\n if len(self.history) > 10:", + "detail": "music.music", + "documentation": {} + }, + { + "label": "Music", + "kind": 6, + "importPath": "music.music", + "description": "music.music", + "peekOfCode": "class Music(commands.Cog):\n def __init__(self, bot: commands.Bot):\n self.bot = bot\n self._states: dict[int, GuildState] = {}\n def state(self, guild_id: int) -> GuildState:\n if guild_id not in self._states:\n self._states[guild_id] = GuildState()\n return self._states[guild_id]\n # ── connect lavalink ─────────────────────────────────────────────────────\n @commands.Cog.listener()", + "detail": "music.music", + "documentation": {} + }, + { + "label": "fmt_duration", + "kind": 2, + "importPath": "music.music", + "description": "music.music", + "peekOfCode": "def fmt_duration(ms: int) -> str:\n s = ms // 1000\n m, s = divmod(s, 60)\n h, m = divmod(m, 60)\n return f\"{h}:{m:02}:{s:02}\" if h else f\"{m}:{s:02}\"\ndef progress_bar(position_ms: int, duration_ms: int, width: int = 14) -> str:\n if duration_ms == 0:\n return \"▬\" * width\n pct = min(position_ms / duration_ms, 1.0)\n filled = int(pct * width)", + "detail": "music.music", + "documentation": {} + }, + { + "label": "progress_bar", + "kind": 2, + "importPath": "music.music", + "description": "music.music", + "peekOfCode": "def progress_bar(position_ms: int, duration_ms: int, width: int = 14) -> str:\n if duration_ms == 0:\n return \"▬\" * width\n pct = min(position_ms / duration_ms, 1.0)\n filled = int(pct * width)\n return \"▬\" * filled + \"🔘\" + \"▬\" * (width - filled)\ndef is_dj():\n \"\"\"Soft DJ check — allows anyone to use info/play, restricts control commands.\"\"\"\n async def predicate(ctx: commands.Context):\n if any(r.name.lower() == \"dj\" for r in ctx.author.roles):", + "detail": "music.music", + "documentation": {} + }, + { + "label": "is_dj", + "kind": 2, + "importPath": "music.music", + "description": "music.music", + "peekOfCode": "def is_dj():\n \"\"\"Soft DJ check — allows anyone to use info/play, restricts control commands.\"\"\"\n async def predicate(ctx: commands.Context):\n if any(r.name.lower() == \"dj\" for r in ctx.author.roles):\n return True\n await ctx.reply(\n embed=discord.Embed(\n description=\"🎧 You need the **DJ** role to use this command.\",\n color=C_ERR,\n )", + "detail": "music.music", + "documentation": {} + }, + { + "label": "LOOP_TRACK", + "kind": 5, + "importPath": "music.music", + "description": "music.music", + "peekOfCode": "LOOP_TRACK = 1\nLOOP_QUEUE = 2\nLOOP_LABEL = {\n LOOP_OFF: \"Off\",\n LOOP_TRACK: \"🔂 Track\",\n LOOP_QUEUE: \"🔁 Queue\",\n}\n# ── per-guild state ──────────────────────────────────────────────────────────\nclass GuildState:\n def __init__(self):", + "detail": "music.music", + "documentation": {} + }, + { + "label": "LOOP_QUEUE", + "kind": 5, + "importPath": "music.music", + "description": "music.music", + "peekOfCode": "LOOP_QUEUE = 2\nLOOP_LABEL = {\n LOOP_OFF: \"Off\",\n LOOP_TRACK: \"🔂 Track\",\n LOOP_QUEUE: \"🔁 Queue\",\n}\n# ── per-guild state ──────────────────────────────────────────────────────────\nclass GuildState:\n def __init__(self):\n self.queue: deque = deque()", + "detail": "music.music", + "documentation": {} + }, + { + "label": "LOOP_LABEL", + "kind": 5, + "importPath": "music.music", + "description": "music.music", + "peekOfCode": "LOOP_LABEL = {\n LOOP_OFF: \"Off\",\n LOOP_TRACK: \"🔂 Track\",\n LOOP_QUEUE: \"🔁 Queue\",\n}\n# ── per-guild state ──────────────────────────────────────────────────────────\nclass GuildState:\n def __init__(self):\n self.queue: deque = deque()\n self.history: list = [] # last 10 tracks", + "detail": "music.music", + "documentation": {} + }, + { + "label": "intents", + "kind": 5, + "importPath": "main", + "description": "main", + "peekOfCode": "intents = discord.Intents.default()\nintents.message_content = True\nbot = commands.Bot(command_prefix='!', intents=intents)\n@bot.event\nasync def on_ready():\n print(f'✅ {bot.user} is online!')\nasync def main():\n async with bot:\n await bot.load_extension('cogs.general')\n await bot.load_extension('cogs.chance')", + "detail": "main", + "documentation": {} + }, + { + "label": "intents.message_content", + "kind": 5, + "importPath": "main", + "description": "main", + "peekOfCode": "intents.message_content = True\nbot = commands.Bot(command_prefix='!', intents=intents)\n@bot.event\nasync def on_ready():\n print(f'✅ {bot.user} is online!')\nasync def main():\n async with bot:\n await bot.load_extension('cogs.general')\n await bot.load_extension('cogs.chance')\n await bot.load_extension('cogs.gifs')", + "detail": "main", + "documentation": {} + }, + { + "label": "bot", + "kind": 5, + "importPath": "main", + "description": "main", + "peekOfCode": "bot = commands.Bot(command_prefix='!', intents=intents)\n@bot.event\nasync def on_ready():\n print(f'✅ {bot.user} is online!')\nasync def main():\n async with bot:\n await bot.load_extension('cogs.general')\n await bot.load_extension('cogs.chance')\n await bot.load_extension('cogs.gifs')\n await bot.load_extension('cogs.copypasta')", + "detail": "main", + "documentation": {} + } +] \ No newline at end of file diff --git a/README.md b/README.md index 552b4f1..83134d0 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,24 @@ -# yuuka - -Personal Discord bot running on my Arch Linux laptop. Named after Hayase Yuuka. - -## Features - -- Music playback via Lavalink — YouTube search, URLs, playlists, queue management -- Live system monitoring — CPU, RAM, temps, disk, top processes, fastfetch -- Fun commands — dice, coinflip, aura meter, rank, gifs, copypastas - -## Stack - -- Python + discord.py -- Wavelink + Lavalink for audio -- psutil + lm-sensors for sysinfo -- Hosted on an Acer Nitro AN515-51 running Arch Linux -- Runs as a systemd service, updated via git pull over SSH - -## Commands - -- `!music` — full music command list -- `!sysinfo` — full sysinfo command list -- `!gifs` — full gif list -- `!copypasta` — full copypasta list +# yuuka + +Personal Discord bot running on my Arch Linux laptop. Named after Hayase Yuuka. + +## Features + +- Music playback via Lavalink — YouTube search, URLs, playlists, queue management +- Live system monitoring — CPU, RAM, temps, disk, top processes, fastfetch +- Fun commands — dice, coinflip, aura meter, rank, gifs, copypastas + +## Stack + +- Python + discord.py +- Wavelink + Lavalink for audio +- psutil + lm-sensors for sysinfo +- Hosted on an Acer Nitro AN515-51 running Arch Linux +- Runs as a systemd service, updated via git pull over SSH + +## Commands + +- `!music` — full music command list +- `!sysinfo` — full sysinfo command list +- `!gifs` — full gif list +- `!help` — everything else \ No newline at end of file diff --git a/cogs/__pycache__/__init__.cpython-314.pyc b/cogs/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..1e656f8 Binary files /dev/null and b/cogs/__pycache__/__init__.cpython-314.pyc differ diff --git a/cogs/__pycache__/chance.cpython-314.pyc b/cogs/__pycache__/chance.cpython-314.pyc new file mode 100644 index 0000000..3501d8b Binary files /dev/null and b/cogs/__pycache__/chance.cpython-314.pyc differ diff --git a/cogs/__pycache__/copypasta.cpython-314.pyc b/cogs/__pycache__/copypasta.cpython-314.pyc new file mode 100644 index 0000000..63c3484 Binary files /dev/null and b/cogs/__pycache__/copypasta.cpython-314.pyc differ diff --git a/cogs/__pycache__/general.cpython-314.pyc b/cogs/__pycache__/general.cpython-314.pyc new file mode 100644 index 0000000..4b292ec Binary files /dev/null and b/cogs/__pycache__/general.cpython-314.pyc differ diff --git a/cogs/__pycache__/gifs.cpython-314.pyc b/cogs/__pycache__/gifs.cpython-314.pyc new file mode 100644 index 0000000..c672fa5 Binary files /dev/null and b/cogs/__pycache__/gifs.cpython-314.pyc differ diff --git a/cogs/__pycache__/sysinfo.cpython-314.pyc b/cogs/__pycache__/sysinfo.cpython-314.pyc new file mode 100644 index 0000000..479c045 Binary files /dev/null and b/cogs/__pycache__/sysinfo.cpython-314.pyc differ diff --git a/cogs/chance.py b/cogs/chance.py index 6b22c75..d9ee284 100644 --- a/cogs/chance.py +++ b/cogs/chance.py @@ -1,45 +1,45 @@ -#this is where coinflip and dice lives -from discord.ext import commands -import random - -class Fun(commands.Cog): - def __init__(self, bot): - self.bot = bot - - # this command lists all the fun commands, not an actualy fun command## - @commands.command() - async def fun(self, ctx): - fun_commands = [f'!{cmd.name}' for cmd in self.get_commands() if cmd.name != 'fun'] - await ctx.reply('\n'.join(sorted(fun_commands))) - ###################################################################### - - @commands.command() - async def coin(self, ctx): - result = random.choice(['🪙 Heads', '🪙 Tails']) - await ctx.reply(f'{result}') - - @commands.command() - async def dice(self, ctx): - result = random.randint(1, 6) - await ctx.reply(f'🎲 {result}') - - @commands.command() - async def pp(self, ctx): - length = random.randint(1, 15) - pp = '8' + '=' * length + 'D' - await ctx.reply(f"{ctx.author.mention}'s pp size: {pp}") - - @commands.command() - async def rank(self, ctx): - ranks = ['Substance', 'Molecule', 'Atom', 'Proton', 'Neutron', 'Electron', 'Quark', 'Superstring', 'Singularity', 'giorgaras200'] - rank = random.choice(ranks) - await ctx.reply(f"{ctx.author.mention}'s rank: {rank}") - - @commands.command() - async def aura(self, ctx): - aura = random.randint(-1000000000, +1000000000) - await ctx.reply(f"{ctx.author.mention}'s aura: {aura:,}") - - -async def setup(bot): +#this is where coinflip and dice lives +from discord.ext import commands +import random + +class Fun(commands.Cog): + def __init__(self, bot): + self.bot = bot + + # this command lists all the fun commands, not an actualy fun command## + @commands.command() + async def fun(self, ctx): + fun_commands = [f'!{cmd.name}' for cmd in self.get_commands() if cmd.name != 'fun'] + await ctx.reply('\n'.join(sorted(fun_commands))) + ###################################################################### + + @commands.command() + async def coin(self, ctx): + result = random.choice(['🪙 Heads', '🪙 Tails']) + await ctx.reply(f'{result}') + + @commands.command() + async def dice(self, ctx): + result = random.randint(1, 6) + await ctx.reply(f'🎲 {result}') + + @commands.command() + async def pp(self, ctx): + length = random.randint(1, 15) + pp = '8' + '=' * length + 'D' + await ctx.reply(f"{ctx.author.mention}'s pp size: {pp}") + + @commands.command() + async def rank(self, ctx): + ranks = ['Substance', 'Molecule', 'Atom', 'Proton', 'Neutron', 'Electron', 'Quark', 'Superstring', 'Singularity', 'giorgaras200'] + rank = random.choice(ranks) + await ctx.reply(f"{ctx.author.mention}'s rank: {rank}") + + @commands.command() + async def aura(self, ctx): + aura = random.randint(-1000000000, +1000000000) + await ctx.reply(f"{ctx.author.mention}'s aura: {aura:,}") + + +async def setup(bot): await bot.add_cog(Fun(bot)) \ No newline at end of file diff --git a/cogs/copypasta.py b/cogs/copypasta.py index 787e826..97f0462 100644 --- a/cogs/copypasta.py +++ b/cogs/copypasta.py @@ -1,63 +1,121 @@ -# this is where copypastas live -import discord -import io -from discord.ext import commands - -class Copypasta(commands.Cog): - def __init__(self, bot): - self.bot = bot - - # this command lists all the copypasta commands, not an actualy copypasta command## - @commands.command() - async def copypasta(self, ctx): - pasta_commands = [f'!{cmd.name}' for cmd in self.get_commands() if cmd.name != 'copypasta'] - await ctx.reply('\n'.join(sorted(pasta_commands))) - ###################################################################### - - @commands.command() - async def yuukapasta(self, ctx): - pasta = ("""Since Yuuka is the paragon of human virtue without equal past or present, she is most resplendent in love, tributes and accolades. Waking or sleeping, I must not forget Yuuka’s great boon and in order to return her favour by day and by night, I should only think of fulfilling my loyalty. - -Who is Yuuka? - -For the blind, she is their vision. For the deaf, she is their music. For the mute, she is their voice. For the anosmiac, she is their aroma. For the numb, she is their feeling. For the atrophied, she is their muscle. - -For the starved, she is their sustenance. For the thirsty, she is their water. For the exhausted, she is their energy. - -For the depressed, she is their happiness. For the disillusioned, she is their hope. For the pessimistic, she is their optimism. - -For the disadvantaged, she is their champion. For the marginalised, she is their justice. For the oppressed, she is their salvation. - -For the righteous, she is their symbol. For the enlightened, she is their muse. For the erudite, she is their education. - -If Yuuka speaks, I listen. If Yuuka questions, I answer. If Yuuka orders, I obey. - -If Yuuka opines, I agree. If Yuuka fears, I assure. If Yuuka hopes, I dream. - -If Yuuka is happy, I am jubilant. If Yuuka is angry, I am apoplectic. If Yuuka is sad, I am disconsolate. - -Yuuka is my ideal, Yuuka is my romance, Yuuka is my passion. - -Yuuka is my strength, Yuuka is my compass, Yuuka is my destination. - -Yuuka is my language, Yuuka is my culture, Yuuka is my religion. - -Yuuka is my ocean, Yuuka is my mountain, Yuuka is my sky, Yuuka is my air, Yuuka is my sun, Yuuka is my moon, Yuuka is my world. - -Yuuka is history, Yuuka is present, Yuuka is future. - -If Yuuka has a million fans, I am one of them. If Yuuka has a thousand fans, I am one of them. If Yuuka has a hundred fans, I am one of them. If Yuuka has ten fans, I am one of them. If Yuuka has only one fan, that is me. If Yuuka has no fans, I no longer exist. - -If the whole universe is for Yuuka , then I am for the whole universe. If the whole universe is against Yuuka, then I am against the whole universe. - -I will love, cherish, and protect Yuuka until my very last breath; my successors will love, cherish and protect Yuuka until their very last breath.""") - await ctx.reply(file=discord.File(io.StringIO(pasta), filename='yuukapasta.txt')) - -async def setup(bot): - await bot.add_cog(Copypasta(bot)) - - #template for future copypasta commands - #@commands.command() - #async def the command you wanna give(self, ctx): - # pasta = """your entire pasta here""" - # await ctx.reply(file=discord.File(io.StringIO(pasta), filename="file name.txt")) \ No newline at end of file +# this is where copypastas live +import discord +import io +from discord.ext import commands + +class Copypasta(commands.Cog): + def __init__(self, bot): + self.bot = bot + + # this command lists all the copypasta commands, not an actualy copypasta command## + @commands.command() + async def copypasta(self, ctx): + pasta_commands = [f'!{cmd.name}' for cmd in self.get_commands() if cmd.name != 'copypasta'] + await ctx.reply('\n'.join(sorted(pasta_commands))) + ###################################################################### + + @commands.command() + async def yuukapasta(self, ctx): + pasta = ("""Since Yuuka is the paragon of human virtue without equal past or present, she is most resplendent in love, tributes and accolades. Waking or sleeping, I must not forget Yuuka’s great boon and in order to return her favour by day and by night, I should only think of fulfilling my loyalty. + +Who is Yuuka? + +For the blind, she is their vision. For the deaf, she is their music. For the mute, she is their voice. For the anosmiac, she is their aroma. For the numb, she is their feeling. For the atrophied, she is their muscle. + +For the starved, she is their sustenance. For the thirsty, she is their water. For the exhausted, she is their energy. + +For the depressed, she is their happiness. For the disillusioned, she is their hope. For the pessimistic, she is their optimism. + +For the disadvantaged, she is their champion. For the marginalised, she is their justice. For the oppressed, she is their salvation. + +For the righteous, she is their symbol. For the enlightened, she is their muse. For the erudite, she is their education. + +If Yuuka speaks, I listen. If Yuuka questions, I answer. If Yuuka orders, I obey. + +If Yuuka opines, I agree. If Yuuka fears, I assure. If Yuuka hopes, I dream. + +If Yuuka is happy, I am jubilant. If Yuuka is angry, I am apoplectic. If Yuuka is sad, I am disconsolate. + +Yuuka is my ideal, Yuuka is my romance, Yuuka is my passion. + +Yuuka is my strength, Yuuka is my compass, Yuuka is my destination. + +Yuuka is my language, Yuuka is my culture, Yuuka is my religion. + +Yuuka is my ocean, Yuuka is my mountain, Yuuka is my sky, Yuuka is my air, Yuuka is my sun, Yuuka is my moon, Yuuka is my world. + +Yuuka is history, Yuuka is present, Yuuka is future. + +If Yuuka has a million fans, I am one of them. If Yuuka has a thousand fans, I am one of them. If Yuuka has a hundred fans, I am one of them. If Yuuka has ten fans, I am one of them. If Yuuka has only one fan, that is me. If Yuuka has no fans, I no longer exist. + +If the whole universe is for Yuuka , then I am for the whole universe. If the whole universe is against Yuuka, then I am against the whole universe. + +I will love, cherish, and protect Yuuka until my very last breath; my successors will love, cherish and protect Yuuka until their very last breath.""") + await ctx.reply(file=discord.File(io.StringIO(pasta), filename='yuukapasta.txt')) + + @commands.command() + async def yuyuko(self, ctx): + pasta = r"""⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⠶⢒⣶⠏⠀⠀⢸⣦⣀⣀⠀⠀⠀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⠟⠉⠀⢀⡾⠃⠀⠀⠀⠀⣿⠛⠛⠛⠛⠛⠛⠉⠛⠛⠛⠶⢤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⠾⠋⠀⠀⠀⣠⡟⠁⠀⡀⠀⠀⠀⢹⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠟⠁⠀⠀⠀⠀⣰⠟⣤⣾⡿⠿⣿⣆⠀⠀⢿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠻⢶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠟⠁⠀⠀⠀⠀⠀⣴⣯⣾⡿⣿⠟⣳⢻⣿⡆⠀⠈⢿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠟⠁⠀⠀⠀⠀⠀⠀⣼⢻⣿⡟⠰⣿⣟⣉⣼⣿⠃⠀⠀⠀⠻⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣄⣀⠀⠀⠀⠀⠀⠙⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⠋⠀⠀⠀⠀⠀⠀⠀⢸⡇⣿⣿⠀⠀⠙⠛⣟⠛⠁⠀⠀⠀⠀⠀⠈⠻⣷⡀⠀⠀⠀⠀⠀⣠⣾⣿⠿⠛⠁⠀⠀⠀⠀⠀⢹⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠸⣇⢿⣿⣀⣤⣶⣿⠿⠿⣿⣶⣶⣶⣿⠗⠀⣀⣹⡿⠶⠦⣤⠶⢿⣿⣭⣤⣶⣶⣿⣯⣤⣤⣤⣶⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡟⠀⠀⠀⠀⠀⠲⠶⣶⣦⣤⣤⣿⣈⣿⠿⠿⢭⣤⣀⣀⣠⣬⠿⣿⣿⣿⣿⣿⣿⠿⠟⠛⠉⠛⢛⠉⠙⠛⠿⣿⣿⡉⠉⠛⠿⣿⣿⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣆⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⠿⠋⠁⠀⢀⣴⡿⠟⠋⠉⠀⠀⠀⠀⢸⣿⣯⣤⣄⣀⠀⠀⠀⣼⠀⠀⠀⠀⠀⠙⣻⣦⣄⠀⠈⠙⠻⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⣠⣤⣤⣄⣀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣶⣶⣾⡿⠟⠛⣻⡿⠋⠁⠀⠀⠀⢠⣾⢿⣿⣿⣷⣦⣄⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣷⣦⣟⣤⣤⣶⣾⣿⣿⣿⣿⣿⡂⠀⠀⠀⠀⠙⢷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⢸⣿⣏⠉⠛⠻⢿⣷⡀⠀⠀⠀⠀⢀⣠⡶⠟⠉⢀⣴⣞⣋⠀⠀⠀⠀⠀⢠⡟⠁⠀⠙⢿⣿⣿⣿⣿⣦⣄⡀⠀⣿⠟⣛⣿⣿⣟⣻⣿⣿⣿⣿⣿⣿⣿⣿⠿⢿⣷⡄⠀⠀⠀⠀⠀⣙⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠙⠿⣷⣦⡄⠀⠉⠁⠀⢀⣤⠾⠛⠁⠀⠀⠀⣾⣿⣿⣿⣿⣷⣶⣤⣀⡟⣀⣠⣤⣶⣿⣿⣿⠛⣿⣏⠉⠛⠶⢶⡟⢩⡽⣯⠉⠉⠉⠛⠛⠛⠿⢿⣿⣿⣦⣤⣙⣿⣤⣶⣶⣿⣿⣿⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⣀⣤⣄⣀⣉⡁⠀⢀⣠⣾⣋⡁⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣯⣩⣿⣟⣻⠉⢿⣷⣌⠻⣷⣾⣿⣿⣦⡀⠀⠙⢷⣅⠘⣷⠀⠀⠀⢀⣼⠃⡈⢷⡈⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⢸⣿⡋⠙⠛⠻⢿⣷⢸⣿⣿⣿⣿⣿⣷⣶⣦⣤⣀⣀⣤⣾⣿⣿⣿⣿⣿⡟⢿⣿⡿⢶⣆⠙⠻⣷⣮⣿⣿⣿⣿⣿⣿⣷⣞⣛⣛⣿⣧⣴⣾⡿⠃⣿⣿⣾⣇⠸⣿⣿⣿⣯⣻⣿⣿⣿⣽⣿⠆⢀⣤⣶⡤⠀⠀⠀⠒⢾⣷⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠈⢿⣷⣄⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠁⢸⣿⣿⣧⡾⠻⣿⣦⣽⣧⡀⠘⣿⣟⠛⠛⢛⣻⣿⣯⣉⠉⠉⢻⣿⡋⠁⣰⣟⡏⢻⣿⣿⠀⢿⡟⣿⣿⣿⣿⣿⡟⠋⠁⠀⢸⣿⡋⠀⠀⠀⣠⣶⣿⠟⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠙⠻⢿⡆⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⡿⠋⠁⠘⣿⣧⠈⣿⣿⣟⠁⠀⠈⠻⣿⣿⣿⣶⣾⣿⣷⣆⠛⣋⣡⣤⣭⣤⣀⡀⢻⡇⢠⣿⠉⠁⣼⣿⣿⣄⣸⡇⠸⣿⣿⣿⣿⣷⣄⠀⠀⠈⠉⠀⠀⢰⣾⡿⠋⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⢿⣿⣿⣿⣿⣿⣿⢻⣷⡀⢤⠘⢿⣿⣿⣛⣿⣆⠐⠚⢛⡈⠻⢿⣿⣿⠿⠿⢿⣿⣿⠿⠛⠛⠙⠛⠻⣾⣧⣾⠏⢀⣼⣿⣿⣿⣿⡻⣯⠀⢹⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣷⣶⣿⣿⣿⣿⣿⣿⣸⣿⡟⠛⠃⠘⣿⣿⣏⣛⣿⣷⣿⣿⣿⣷⣄⠉⠁⠀⠀⠀⠉⠀⠀⣠⣆⡀⣀⣴⣿⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⡼⣧⢰⣿⣿⣿⣿⣹⣿⠀⠀⠀⠀⠀⠀⠀⢀⡄⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣯⠛⠀⠀⣦⡙⣿⣯⣿⡿⠟⠋⠁⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠚⠻⠋⠙⣿⣿⣿⣿⣿⣿⣿⣿⠟⣿⣿⣿⠙⣿⣿⢻⣙⠿⣿⣿⣿⡿⠀⠀⠸⠗⠁⢀⣴⣷⠇⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣩⣿⣿⠿⢋⣿⣿⣷⡀⠀⠙⣿⣿⣿⣷⣀⣠⣤⠆⠀⠀⠀⠀⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⡿⠋⢱⡟⠁⢠⣿⣿⡏⣰⣿⣿⣷⣝⠇⠙⢿⣏⠀⢀⡀⠀⢠⣶⡿⠟⠁⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⣼⡿⢿⣿⣿⣶⣤⣈⣻⣿⣿⣿⠻⠋⠀⠀⠀⠀⠀⠀⢀⣀⣤⡴⢶⠀⠀⠀⠀⣼⣿⠏⠀⠀⠀⠀⣰⡿⣿⣿⣶⣿⣿⣿⣿⣿⣿⣶⣶⣬⣿⣿⠃⠀⠀⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⠃⠀⠙⣿⠛⣿⣍⠻⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⢸⣿⠋⠀⢀⣼⠃⣤⣄⣴⣿⠁⠀⣠⣴⣦⣾⠋⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⢰⡏⡄⣿⣿⣆⠙⢿⣿⣿⣷⣦⣄⡀⠀⠀⠀⠉⠛⠛⠋⠁⠀⠀⣩⣿⣿⣠⣿⣿⣿⣿⠁⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠈⢹⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣤⣠⡟⠉⣱⡿⣿⣿⣷⣦⡙⠿⣿⡛⠿⣿⣷⣶⣤⣀⡀⠀⠀⠀⢀⣶⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠒⠟⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠾⣦⣤⣽⠿⢋⣠⣴⣿⣳⣿⣿⣿⣿⣿⣷⣾⣿⣦⠈⠙⢿⣿⣿⠉⠛⠶⠶⠟⠁⠘⣿⣿⣿⣿⡿⠿⣿⣿⣷⣿⣯⡻⣿⣿⣿⣿⣿⠁⣿⠇⠀⢀⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣤⣀⠀⠀⢀⣴⣿⣿⢷⣛⣯⣽⣿⣿⣿⣿⠟⣸⣿⣿⠟⢻⣿⣷⡀⠀⢸⣿⢻⡇⠀⠀⠀⠀⠀⠀⣼⢿⣿⣿⣧⣀⣀⠈⠙⠛⠻⠿⠿⣿⣿⣿⣿⡷⠿⠛⠛⠉⠉⠉⠉⠙⠻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⣠⣴⠶⠶⣤⣠⡾⠋⠁⠀⢹⡇⠀⣿⣿⣿⡷⠛⠉⠀⠀⠀⠀⠉⠻⢿⣿⠿⠷⣦⣾⣿⣿⡇⠀⣼⣿⢸⣧⡀⠀⠀⠀⠀⣸⠏⠀⠉⠛⠛⠋⠉⠀⠀⠀⠀⠀⠀⣠⣴⠟⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣌⢿⣄⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⣾⠋⠀⠀⠀⠀⠉⠀⠀⠀⠀⣸⠇⠀⢈⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠳⣦⣿⣷⣿⣿⣡⡾⠿⠋⠘⠹⣇⠀⠀⠀⣰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⠾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡄⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⢿⣄⡀⠀⠀⠀⠀⠀⠀⢀⣼⠏⠀⠀⣾⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢷⣄⡉⠀⠀⠀⠀⠀⠀⠻⠀⠀⢰⡟⠀⠀⠀⠀⠀⢀⣀⣤⡶⠞⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣷⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠉⠛⠳⢶⣤⣀⡀⢀⡾⠃⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠳⢦⣤⣀⠀⠀⠀⠀⠀⡟⠀⢀⣀⣤⡶⠞⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡄⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⠇⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⢷⡄⠀⠀⣰⡟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⠦⠾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⢀⣀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣟⡷⢿⡆⢸⣇⠀⠀⠀⠀⠀⠀⢰⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣧⡟⠙⢷⡀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⣿⠟⠀⠀⢿⣶⣄⠀⠀⠀⠀⢀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⡇⠀⢸⣧⣄⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠀⠀⠀⠘⣷⠙⠳⠶⢤⣶⡿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣬⡿⢸⡇⠀⢀⣠⡿⠁ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣸⡧⠤⠶⠟⠛⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⠇⠿⠶⠛⠋⠉⠀⠀ +⠀⠀⠀⠀⠀⠀⣀⣤⣤⣤⣄⣀⣀⣀⣤⠶⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⢀⣠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢷⣄⠀⠀⠀⠀⠀⢀⣠⡿⢱⡟⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⣤⡶⠛⠉⠀⣶⣤⡀⠉⠉⠛⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⣶⣤⣤⡶⠟⠋⢠⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⣼⠃⠀⠀⠀⠀⠘⣿⣽⣷⣆⠀⠘⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢷⣄⠀⢀⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⢠⡾⠋⠀⠈⠻⣦⡀⠀⠹⣦⠀⢻⣆⠀⢻⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡾⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⡤⠤⣤⣀⣀⠀⠀⠀⠙⢷⣾⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣸⡇⢰⣤⡀⠀⠈⠻⣦⣀⠙⢷⣄⠙⠳⠾⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⠾⠋⠉⡀⠀⠀⠀⠈⠉⠙⠛⠛⠒⠒⠛⠳⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀ +⣿⣷⠈⢿⣿⣦⡀⠀⠙⠿⣷⣦⣙⢷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠟⠉⣀⣤⣶⠿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣷⡀⠀⠀⠀⠀⠀⠀ +⢻⣿⣧⠀⠻⣿⡻⣦⣄⡀⠈⠻⢿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣯⣶⣿⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡇⠀⠀⠀⠀⠀⠀ +⠘⣿⣿⣷⣄⠈⠛⠶⢿⣿⣷⣶⣤⣝⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣟⣤⡾⠋⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣿⠃⠀⠀⠀⠀⠀⠀ +⠀⠘⢷⡽⠿⠷⢦⣤⣤⣤⣉⣙⣻⡎⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢈⣽⠟⠉⠀⢀⣠⣤⣶⣿⠿⠛⠀⠀⠀⠀⠀⠀⠀⣀⣤⡴⢾⣿⣽⢿⡏⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⢸⠟⠓⠚⠛⠛⠛⠉⠁⠈⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠿⣥⣤⣶⣿⣿⣿⠟⠋⠀⠀⠀⠀⠀⠀⠀⢀⣴⠟⠋⣁⣼⣿⣯⣄⢸⡇⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⢸⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢾⣧⡴⠾⢻⣏⠁⣿⣄⣠⣤⣴⡶⠾⠓⠒⢀⣴⠟⢁⣤⣾⡿⠛⠉⢀⡿⣸⠇⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠸⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⠋⠀⣿⢹⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⢿⣿⣯⣤⣤⠶⠖⠿⠋⣡⣾⡿⠛⠁⠀⠀⢀⣾⢃⡿⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠹⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⠟⠁⠀⠀⢹⡆⠹⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠛⠛⠛⠛⠛⠛⠉⠀⠀⠀⠀⢠⡾⣡⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠈⠻⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⡴⠞⠋⠀⠀⠀⢀⣠⡟⢻⣆⠈⠻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣟⡴⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠙⠻⢿⣶⣦⣤⣄⣀⣀⠀⠀⠀⠀⢀⣀⣠⣤⠴⠶⠞⠛⠉⠁⠀⠀⠀⣀⣠⡶⠟⠁⠀⠀⠙⢷⣄⠈⠙⢷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣾⣿⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠿⠿⢿⣭⣅⣀⣀⣀⣀⣀⣀⣀⣀⣠⣤⡴⠶⠞⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠉⠛⠶⣤⣌⣙⠳⢦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣶⡿⠟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⣳⡾⢯⣿⣷⣶⣦⣤⣤⣤⣤⠤⡶⢶⣞⡛⠛⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀""" + await ctx.reply(file=discord.File(io.StringIO(pasta), filename="yuyuko.txt")) + +async def setup(bot): + await bot.add_cog(Copypasta(bot)) + + #template for future copypasta commands + #@commands.command() + #async def the command you wanna give(self, ctx): + # pasta = """your entire pasta here""" + # await ctx.reply(file=discord.File(io.StringIO(pasta), filename="file name.txt")) diff --git a/cogs/general.py b/cogs/general.py index c2b78e7..3286ee5 100644 --- a/cogs/general.py +++ b/cogs/general.py @@ -1,18 +1,18 @@ -from discord.ext import commands - -class General(commands.Cog): - def __init__(self, bot): - self.bot = bot - - @commands.command() - async def yuuka(self, ctx): - await ctx.send('kanpeki!') - -async def setup(bot): - await bot.add_cog(General(bot)) - -@commands.Cog.listener() -async def on_command_error(self, ctx, error): - if isinstance(error, commands.CommandNotFound): - return # ignore typos silently +from discord.ext import commands + +class General(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.command() + async def yuuka(self, ctx): + await ctx.send('kanpeki!') + +async def setup(bot): + await bot.add_cog(General(bot)) + +@commands.Cog.listener() +async def on_command_error(self, ctx, error): + if isinstance(error, commands.CommandNotFound): + return # ignore typos silently print(f'Error: {error}') \ No newline at end of file diff --git a/cogs/gifs.py b/cogs/gifs.py index 511b500..ad6be5a 100644 --- a/cogs/gifs.py +++ b/cogs/gifs.py @@ -31,4 +31,4 @@ class Gifs(commands.Cog): await ctx.reply('\n'.join(gif_commands)) async def setup(bot): - await bot.add_cog(Gifs(bot)) \ No newline at end of file + await bot.add_cog(Gifs(bot)) diff --git a/cogs/sysinfo.py b/cogs/sysinfo.py index fe57554..71b85b4 100644 --- a/cogs/sysinfo.py +++ b/cogs/sysinfo.py @@ -1,5 +1,4 @@ import subprocess -import discord from discord.ext import commands import re import psutil @@ -98,5 +97,15 @@ class SysInfo(commands.Cog): count = data['response']['player_count'] await ctx.reply(f'🎮 Strinova — {count:,} players online right now') + #this is unrelated, strinova player count tracker + #i just couldnt be assed with it lol + @commands.command() + async def strinova(self, ctx): + async with aiohttp.ClientSession() as session: + async with session.get('https://api.steampowered.com/ISteamUserStats/GetNumberOfCurrentPlayers/v1/?appid=1282270') as r: + data = await r.json() + count = data['response']['player_count'] + await ctx.reply(f'🎮 Strinova — {count:,} players online right now') + async def setup(bot): - await bot.add_cog(SysInfo(bot)) \ No newline at end of file + await bot.add_cog(SysInfo(bot)) diff --git a/cogs/wavelink/__init__.py b/cogs/wavelink/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cogs/wavelink/__pycache__/__init__.cpython-314.pyc b/cogs/wavelink/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..10292f7 Binary files /dev/null and b/cogs/wavelink/__pycache__/__init__.cpython-314.pyc differ diff --git a/credentials_test.env b/credentials_test.env index ba55021..35d519f 100644 --- a/credentials_test.env +++ b/credentials_test.env @@ -1,3 +1,3 @@ -#this is where scary stuff where you put your credentials keys etc goes - +#this is where scary stuff where you put your credentials keys etc goes + DISCORD_TOKEN="yo token here" \ No newline at end of file diff --git a/main.py b/main.py index d47858e..a8e9af4 100644 --- a/main.py +++ b/main.py @@ -1,43 +1,43 @@ -import discord -from discord.ext import commands -from dotenv import load_dotenv -import os -import logging -import asyncio - -from tgbridge.forwarder import TelegramForwarder - -load_dotenv('credentials.env') - -intents = discord.Intents.default() -intents.message_content = True - -bot = commands.Bot(command_prefix='!', intents=intents) - -forwarder = TelegramForwarder( - token=os.getenv('TELEGRAM_BOT_TOKEN'), - group_id=int(os.getenv('TELEGRAM_GROUP_ID')), - webhook_url=os.getenv('DISCORD_WEBHOOK_URL'), -) - -@bot.event -async def on_ready(): - print(f'✅ {bot.user} is online!') - asyncio.create_task(forwarder.start()) - -async def main(): - async with bot: - await bot.load_extension('cogs.general') - await bot.load_extension('cogs.chance') - await bot.load_extension('cogs.gifs') - await bot.load_extension('cogs.copypasta') - await bot.load_extension('cogs.sysinfo') - await bot.load_extension('music.music') - - try: - await bot.start(os.getenv('DISCORD_TOKEN')) - finally: - await forwarder.stop() - -logging.basicConfig(level=logging.INFO) -asyncio.run(main()) \ No newline at end of file +import discord +from discord.ext import commands +from dotenv import load_dotenv +import os +import logging +import asyncio + +from tgbridge.forwarder import TelegramForwarder + +load_dotenv('credentials.env') + +intents = discord.Intents.default() +intents.message_content = True + +bot = commands.Bot(command_prefix='!', intents=intents) + +forwarder = TelegramForwarder( + token=os.getenv('TELEGRAM_BOT_TOKEN'), + group_id=int(os.getenv('TELEGRAM_GROUP_ID')), + webhook_url=os.getenv('DISCORD_WEBHOOK_URL'), +) + +@bot.event +async def on_ready(): + print(f'✅ {bot.user} is online!') + asyncio.create_task(forwarder.start()) + +async def main(): + async with bot: + await bot.load_extension('cogs.general') + await bot.load_extension('cogs.chance') + await bot.load_extension('cogs.gifs') + await bot.load_extension('cogs.copypasta') + await bot.load_extension('cogs.sysinfo') + await bot.load_extension('music.music') + + try: + await bot.start(os.getenv('DISCORD_TOKEN')) + finally: + await forwarder.stop() + +logging.basicConfig(level=logging.INFO) +asyncio.run(main()) \ No newline at end of file diff --git a/music/__pycache__/__init__.cpython-314.pyc b/music/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..6b18e73 Binary files /dev/null and b/music/__pycache__/__init__.cpython-314.pyc differ diff --git a/music/__pycache__/music.cpython-314.pyc b/music/__pycache__/music.cpython-314.pyc new file mode 100644 index 0000000..b813394 Binary files /dev/null and b/music/__pycache__/music.cpython-314.pyc differ diff --git a/music/music.py b/music/music.py index 798cbbc..3dba468 100644 --- a/music/music.py +++ b/music/music.py @@ -124,7 +124,8 @@ class Music(commands.Cog): if not vc: vc = await ctx.author.voice.channel.connect(cls=wavelink.Player) vc.autoplay = wavelink.AutoPlayMode.disabled - vc.inactive_timeout = None + vc.inactive_timeout = None + vc.inactive_timeout = None st = self.state(ctx.guild.id) @@ -141,10 +142,9 @@ class Music(commands.Cog): for t in tracks: t.extras = {"requester": str(ctx.author)} st.queue.append(t) - - if not vc.playing and not vc.paused and st.queue: - st.current = st.queue.popleft() - await vc.play(st.current) + if not vc.playing and not vc.paused and st.queue: + st.current = st.queue.popleft() + await vc.play(st.current) embed = discord.Embed( title="📋 Playlist Queued", diff --git a/wavelink/__pycache__/__init__.cpython-314.pyc b/wavelink/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..868aef4 Binary files /dev/null and b/wavelink/__pycache__/__init__.cpython-314.pyc differ diff --git a/wavelink/__pycache__/music.cpython-314.pyc b/wavelink/__pycache__/music.cpython-314.pyc new file mode 100644 index 0000000..5aeb880 Binary files /dev/null and b/wavelink/__pycache__/music.cpython-314.pyc differ