Files
Mace-AIO-Discord-Bot---With…/bot/cogs/commands/notify.py
TheOnlyMace b4110c3d66
Some checks failed
CI / Bot (Python) (push) Failing after 49s
CI / Dashboard (Next.js) (push) Failing after 11s
Update project configuration files, and API routes accordingly. Add SQLite runtime file ignores to .gitignore for better file management.
2026-07-21 17:11:38 +02:00

196 lines
8.0 KiB
Python

# ╔══════════════════════════════════════════════════════════════════╗
# ║ ║
# ║ +-+-+-+-+-+-+-+-+ ║
# ║ |H|e|x|a|H|o|s|t| ║
# ║ +-+-+-+-+-+-+-+-+ ║
# ║ ║
# ║ © 2026 HexaHost — All Rights Reserved ║
# ║ ║
# ║ discord ── https://discord.gg/hexahost ║
# ║ github ── https://github.com/theoneandonlymace ║
# ║ ║
# ╚══════════════════════════════════════════════════════════════════╝
from utils.db_paths import db_path
import discord
from discord.ext import commands
import aiosqlite
from utils.Tools import *
from utils.cv2 import CV2
class NotifCommands(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.db_path = db_path("notify.db")
self.loop_task = self.bot.loop.create_task(self.setup_db())
async def setup_db(self):
async with aiosqlite.connect(self.db_path) as db:
await db.execute("""CREATE TABLE IF NOT EXISTS notifications (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT NOT NULL UNIQUE,
role_id INTEGER NOT NULL,
channel_id INTEGER NOT NULL)""")
await db.commit()
@commands.group(invoke_without_command=True)
async def setnotif(self, ctx):
view = CV2(
"Notification Commands",
"Subcommands: twitch, youtube, list, reset",
)
await ctx.send(view=view)
@setnotif.command()
@blacklist_check()
@ignore_check()
@commands.has_permissions(administrator=True)
async def twitch(self, ctx, role: discord.Role, channel: discord.TextChannel):
async with aiosqlite.connect(self.db_path) as db:
async with db.execute(
"SELECT * FROM notifications WHERE type = ?", ("twitch",)
) as existing:
row = await existing.fetchone()
if row:
view = CV2(
"Access Denied",
"Twitch notification already set. Remove it first.",
)
await ctx.reply(view=view)
return
await db.execute(
"INSERT INTO notifications (type, role_id, channel_id) VALUES (?, ?, ?)",
("twitch", role.id, channel.id),
)
await db.commit()
view = CV2(
"Success",
f"Twitch notifications set for {role.mention} in {channel.mention}.",
)
await ctx.reply(view=view)
@setnotif.command()
@blacklist_check()
@ignore_check()
@commands.has_permissions(administrator=True)
async def youtube(self, ctx, role: discord.Role, channel: discord.TextChannel):
async with aiosqlite.connect(self.db_path) as db:
async with db.execute(
"SELECT * FROM notifications WHERE type = ?", ("youtube",)
) as existing:
row = await existing.fetchone()
if row:
view = CV2(
"Access Denied",
"YouTube notification already set. Remove it first.",
)
await ctx.reply(view=view)
return
await db.execute(
"INSERT INTO notifications (type, role_id, channel_id) VALUES (?, ?, ?)",
("youtube", role.id, channel.id),
)
await db.commit()
view = CV2(
"Success",
f"YouTube notifications set for {role.mention} in {channel.mention}.",
)
await ctx.reply(view=view)
@setnotif.command()
async def list(self, ctx):
async with aiosqlite.connect(self.db_path) as db:
async with db.execute("SELECT * FROM notifications") as cursor:
rows = await cursor.fetchall()
if not rows:
view = CV2(
"Notification Settings",
"No Twitch and YouTube notification channels set.",
)
await ctx.reply(view=view)
return
lines = []
for row in rows:
notif_type = row[1].capitalize()
role = ctx.guild.get_role(row[2])
channel = ctx.guild.get_channel(row[3])
if role and channel:
lines.append(
f"**{notif_type} Notifications**\nRole: {role.mention} | Channel: {channel.mention}"
)
else:
lines.append(
f"**{notif_type} Notifications**\nRole or Channel not found"
)
view = CV2(
"Current Notification Settings",
*lines,
)
await ctx.reply(view=view)
@setnotif.command()
async def reset(self, ctx):
async with aiosqlite.connect(self.db_path) as db:
await db.execute(
"DELETE FROM notifications WHERE type IN (?, ?)", ("twitch", "youtube")
)
await db.commit()
view = CV2(
"Success",
"Twitch and YouTube notifications have been reset.",
)
await ctx.send(view=view)
@commands.Cog.listener()
async def on_presence_update(self, before, after):
streaming = next(
(
activity
for activity in after.activities
if isinstance(activity, discord.Streaming)
),
None,
)
if streaming:
stream_type = (
"twitch"
if "twitch" in streaming.url.lower()
else "youtube"
if "youtube" in streaming.url.lower()
else None
)
if stream_type:
async with aiosqlite.connect(self.db_path) as db:
async with db.execute(
"SELECT role_id, channel_id FROM notifications WHERE type = ?",
(stream_type,),
) as cursor:
row = await cursor.fetchone()
if row:
role_id, channel_id = row
role = after.guild.get_role(role_id)
channel = after.guild.get_channel(channel_id)
if role and channel:
embed = discord.Embed(
title=f"{after.display_name} is now live!",
description=f"{after.mention} is now streaming on {stream_type.capitalize()}.",
color=0xFF0000,
)
embed.add_field(
name="Stream Title",
value=streaming.name,
inline=False,
)
embed.add_field(
name="Watch here", value=streaming.url, inline=False
)
await channel.send(content=role.mention, embed=embed)