196 lines
8.0 KiB
Python
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)
|