Compare commits

5 Commits

Author SHA1 Message Date
neoarz
cad8995324 fix: permission checking 2026-04-14 16:34:03 -04:00
CelloSerenity
70c21cdc0d fix: links 2026-04-09 19:59:50 -04:00
neoarz
f6d3fc4bb4 fix: delay from 5 to 10 sec 2026-01-04 22:06:33 -05:00
neoarz
9c71bf42d7 feat: sidestore unofficial command 2026-01-04 21:54:50 -05:00
neoarz
aaefc42664 chore: update license 2026-01-01 08:52:37 -05:00
11 changed files with 139 additions and 9 deletions

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2025 neoarz
Copyright (c) 2026 neoarz
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -31,5 +31,5 @@ restricted for use:
- Any image files, links, graphics, logos, or media files
- Any proprietary content or branding materials
These assets remain the exclusive property of neoarz and may not be used,
These assets remain the exclusive property of neoarz/the respective owner and may not be used,
distributed, or modified without explicit written permission.

View File

@@ -13,7 +13,7 @@ STICKY_CONFIGS = {
"allowed_role_id": 1432165329483857940,
"message": "# Example sticky message", # You can add your own markdown here
"footer": "This is an automated sticky message.", # This will be appended to the message and uses "-#" to format the footer
"delay": 5, # in seconds
"delay": 10, # in seconds
},
"SideStore": {
"guild_id": 949183273383395328,
@@ -23,7 +23,7 @@ STICKY_CONFIGS = {
"allowed_role_id": 949207813815697479,
"message": "## Please read the README in https://discord.com/channels/949183273383395328/1155736594679083089 and the documentation at <https://docs.sidestore.io> before asking your question.",
"footer": "This is an automated sticky message.",
"delay": 5,
"delay": 10,
},
}
@@ -133,7 +133,9 @@ def stickybot_command():
)
message_content = config.get("message", "*No message set*")
footer_text = config.get("footer", "This is an automated sticky message.")
footer_text = config.get(
"footer", "This is an automated sticky message."
)
full_content = f"{message_content}\n-# {footer_text}"
embed.add_field(

View File

@@ -8,7 +8,7 @@ def jit26_command():
color=0x0169FF,
description=(
"# iOS 26 JIT & Sideloading Walkthrough\n\n---\n\n"
"Click the [button below](https://github.com/CelloSerenity/iOS-26-Sideloading-and-JIT-Complete-Walkthrough) to set up sideloading and enabling JIT for LiveContainer on iOS 26."
"Click the [button below](https://docvault.celloserenity.dev/walkthroughs/LiveContainer-iOS-26-JIT/) to set up sideloading and enabling JIT for LiveContainer on iOS 26."
),
)
embed.set_author(
@@ -24,7 +24,7 @@ def jit26_command():
view.add_item(
discord.ui.Button(
label="Get Started",
url="https://github.com/CelloSerenity/iOS-26-Sideloading-and-JIT-Complete-Walkthrough",
url="https://docvault.celloserenity.dev/walkthroughs/LiveContainer-iOS-26-JIT/",
style=discord.ButtonStyle.primary,
emoji="<:githubicon:1417717356846776340>",
)

View File

@@ -21,6 +21,17 @@ def archive_command():
:param context: The hybrid command context.
:param limit: The limit of messages that should be archived. Default is 10.
"""
if not context.author.guild_permissions.manage_messages:
embed = discord.Embed(
title="Missing Permissions!",
description="You are missing the permission(s) `manage_messages` to execute this command!",
color=0xE02B2B,
).set_author(
name="Moderation", icon_url="https://yes.nighty.works/raw/CPKHQd.png"
)
await context.send(embed=embed, ephemeral=True)
return
log_file = f"{context.channel.id}.log"
messages = []

View File

@@ -23,6 +23,33 @@ def hackban_command():
:param reason: The reason for the ban. Default is "Not specified".
"""
try:
if (
not context.author.guild_permissions.ban_members
and context.author != context.guild.owner
):
embed = discord.Embed(
title="Missing Permissions!",
description="You don't have the `Ban Members` permission to use this command.",
color=0xE02B2B,
).set_author(
name="Moderation",
icon_url="https://yes.nighty.works/raw/CPKHQd.png",
)
await context.send(embed=embed, ephemeral=True)
return
if not context.guild.me.guild_permissions.ban_members:
embed = discord.Embed(
title="Missing Permissions!",
description="I am missing the permission(s) `ban_members` to execute this command!",
color=0xE02B2B,
).set_author(
name="Moderation",
icon_url="https://yes.nighty.works/raw/CPKHQd.png",
)
await context.send(embed=embed, ephemeral=True)
return
await self.bot.http.ban(user_id, context.guild.id, reason=reason)
user = self.bot.get_user(int(user_id)) or await self.bot.fetch_user(
int(user_id)

View File

@@ -15,6 +15,28 @@ def purge_command():
user="The user whose messages should be deleted (optional).",
)
async def purge(self, context, amount: int, user: discord.Member = None):
if not context.author.guild_permissions.manage_messages:
embed = discord.Embed(
title="Missing Permissions!",
description="You are missing the permission(s) `manage_messages` to execute this command!",
color=0xE02B2B,
).set_author(
name="Moderation", icon_url="https://yes.nighty.works/raw/CPKHQd.png"
)
await context.send(embed=embed, ephemeral=True)
return
if not context.guild.me.guild_permissions.manage_messages:
embed = discord.Embed(
title="Missing Permissions!",
description="I am missing the permission(s) `manage_messages` to execute this command!",
color=0xE02B2B,
).set_author(
name="Moderation", icon_url="https://yes.nighty.works/raw/CPKHQd.png"
)
await context.send(embed=embed, ephemeral=True)
return
if context.interaction:
await context.defer(ephemeral=True)

View File

@@ -13,6 +13,7 @@ from .afc import afc_command
from .udid import udid_command
from .half import half_command
from .sparse import sparse_command
from .unofficial import unofficial_command
@app_commands.allowed_contexts(guilds=True, dms=True, private_channels=True)
@@ -103,6 +104,10 @@ class Sidestore(commands.GroupCog, name="sidestore"):
async def sidestore_group_sparse(self, context: Context):
await self._invoke_hybrid(context, "sparse")
@sidestore_group.command(name="unofficial")
async def sidestore_group_unofficial(self, context: Context):
await self._invoke_hybrid(context, "unofficial")
@app_commands.command(name="help", description="SideStore troubleshooting help")
async def help(self, interaction: discord.Interaction):
embed = discord.Embed(
@@ -180,6 +185,13 @@ class Sidestore(commands.GroupCog, name="sidestore"):
async def sparse(self, context):
return await sparse_command()(self, context)
@commands.check(_require_group_prefix)
@commands.hybrid_command(
name="unofficial", description="Unofficial guides and video walkthroughs"
)
async def unofficial(self, context):
return await unofficial_command()(self, context)
async def setup(bot) -> None:
cog = Sidestore(bot)
@@ -195,3 +207,4 @@ async def setup(bot) -> None:
bot.logger.info("Loaded extension 'sidestore.udid'")
bot.logger.info("Loaded extension 'sidestore.half'")
bot.logger.info("Loaded extension 'sidestore.sparse'")
bot.logger.info("Loaded extension 'sidestore.unofficial'")

View File

@@ -13,7 +13,8 @@ def afc_command():
"# AFC Connection Failure\n\n---\n\n"
+ "1. Make sure Wi-Fi is connected to a stable network\n"
+ "2. Make sure LocalDevVPN is connected and updated\n"
+ "3. If issue still persists, replace pairing file using `iloader`. See [Pairing File instructions](https://docs.sidestore.io/docs/advanced/pairing-file) for details"
+ "3. If issue still persists, replace pairing file using `iloader`. See [Pairing File instructions](https://docs.sidestore.io/docs/advanced/pairing-file) for details\n"
+ "-# These steps also apply to heartbeat failures from other idevice-based apps such as StikDebug."
),
)
embed.set_author(

View File

@@ -9,7 +9,7 @@ def pairing_command():
color=0x8E82F9,
description=(
"# How to obtain your pairing file:\n\n---\n\n"
+ "[Click here](https://docs.sidestore.io/advanced/pairing-file) to read the SideStore documentation on replacing your pairing file.\n"
+ "[Click here](https://docs.sidestore.io/docs/advanced/pairing-file) to read the SideStore documentation on replacing your pairing file.\n"
),
)
embed.set_author(

View File

@@ -51,6 +51,11 @@ class SidestoreSelect(discord.ui.Select):
value="udid",
description="SideStore could not determine device UDID",
),
discord.SelectOption(
label="Unofficial Guides",
value="unofficial",
description="Unofficial guides and video walkthroughs",
),
]
super().__init__(placeholder="Choose a SideStore command...", options=options)

View File

@@ -0,0 +1,49 @@
import discord
from discord.ext import commands
def unofficial_command():
@commands.hybrid_command(
name="unofficial", description="Unofficial guides and video walkthroughs"
)
async def unofficial(self, context):
embed = discord.Embed(
color=0x8E82F9,
description=(
"# Unofficial Guides and Videos\n\n---\n\n"
+ "**PLEASE ONLY READ THE OFFICIAL DOCUMENTATION AND TROUBLESHOOTING GUIDE LOCATED AT https://docs.sidestore.io**\n\n"
+ "If you do not try this first we **WILL NOT** provide support.\n\n"
+ "There are currently **NO official video walkthroughs**."
),
)
embed.set_author(
name="SideStore",
icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true",
)
embed.set_footer(text="Last Edited by CelloSerenity")
embed.timestamp = discord.utils.utcnow()
view = discord.ui.View()
view.add_item(
discord.ui.Button(
label="Edit Command",
style=discord.ButtonStyle.secondary,
url="https://github.com/neoarz/Syntrel/blob/main/cogs/sidestore/unofficial.py",
emoji="<:githubicon:1417717356846776340>",
)
)
view.add_item(
discord.ui.Button(
label="Documentation",
style=discord.ButtonStyle.primary,
url="https://docs.sidestore.io",
emoji="<:sidestorepride:1417717648795631787>",
)
)
if context.interaction:
await context.interaction.response.send_message(embed=embed, view=view)
else:
await context.send(embed=embed, view=view)
return unofficial