Merge pull request #2 from neoarz/sidestore-commands

This commit is contained in:
neo
2025-09-17 08:41:57 -04:00
committed by GitHub
10 changed files with 511 additions and 2 deletions

View File

@@ -13,7 +13,7 @@ class Help(commands.Cog, name="help"):
interaction: discord.Interaction, interaction: discord.Interaction,
current: str, current: str,
) -> list[app_commands.Choice[str]]: ) -> list[app_commands.Choice[str]]:
categories = ["general", "fun", "moderation", "template", "owner"] categories = ["general", "fun", "moderation", "template", "owner", "sidestore"]
suggestions = [] suggestions = []
for category in categories: for category in categories:
@@ -56,6 +56,15 @@ class Help(commands.Cog, name="help"):
"warnings": "moderation", "warnings": "moderation",
"archive": "moderation", "archive": "moderation",
"sidestore": "sidestore",
"refresh": "sidestore",
"code": "sidestore",
"crash": "sidestore",
"pairing": "sidestore",
"server": "sidestore",
"half": "sidestore",
"sparse": "sidestore",
"sync": "owner", "sync": "owner",
"cog_management": "owner", "cog_management": "owner",
"shutdown": "owner", "shutdown": "owner",
@@ -68,7 +77,8 @@ class Help(commands.Cog, name="help"):
"fun": "Funny commands", "fun": "Funny commands",
"moderation": "Administration commands", "moderation": "Administration commands",
"template": "Template commands", "template": "Template commands",
"owner": "Owner commands" "owner": "Owner commands",
"sidestore": "SideStore troubleshooting commands"
} }
if category is None: if category is None:

3
cogs/idevice/idevice.py Normal file
View File

@@ -0,0 +1,3 @@
async def setup(bot) -> None:
pass

63
cogs/sidestore/code.py Normal file
View File

@@ -0,0 +1,63 @@
import discord
from discord import app_commands
from discord.ext import commands
from discord.ext.commands import Context
import time
class Code(commands.Cog, name="code"):
def __init__(self, bot) -> None:
self.bot = bot
@commands.hybrid_command(
name="code", description="No code received when signing in with Apple ID"
)
async def code(self, context: Context) -> None:
embed = discord.Embed(
color=0x8e82f9,
description=(
'## Verification Code Not Received When Signing In with Apple ID\n\n---\n\n' +
'1. **For iOS versions below 18.1:**\n' +
' - Open the "Settings" app\n' +
' - Tap on your name at the top of the screen\n' +
' - Navigate to "Sign-In and Security"\n' +
' - Select "Two-Factor Authentication"\n' +
' - Choose "Get Verification Code"\n\n' +
'2. **For iOS versions 18.1 and above:**\n' +
' - Visit [iCloud](https://www.icloud.com) on a web browser\n' +
' - Click "Sign In"\n' +
' - When prompted, you will see two options: "Sign In" and "Use Different Apple Account"\n' +
' - Select the bottom option, "Use Different Apple Account"\n' +
' - Enter your Apple ID and password\n' +
' - Apple will send you a verification code\n' +
' - Use this code in Sidestore to complete the sign-in process\n'
)
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
embed.set_footer(text=f'Last Edited by neoarz')
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/code.py",
emoji="<:githubicon:1417717356846776340>"
))
view.add_item(discord.ui.Button(
label="Documentation",
style=discord.ButtonStyle.primary,
url="https://docs.sidestore.io/docs/troubleshooting/#sign-in-issues",
emoji="<:sidestorepride:1417717648795631787>"
))
if context.interaction:
await context.interaction.response.send_message(embed=embed, view=view)
else:
await context.send(embed=embed, view=view)
async def setup(bot) -> None:
await bot.add_cog(Code(bot))

47
cogs/sidestore/crash.py Normal file
View File

@@ -0,0 +1,47 @@
import discord
from discord import app_commands
from discord.ext import commands
from discord.ext.commands import Context
import time
class Crash(commands.Cog, name="crash"):
def __init__(self, bot) -> None:
self.bot = bot
@commands.hybrid_command(
name="crash", description="Help with SideStore crashing issues"
)
async def crash(self, context: Context) -> None:
embed = discord.Embed(
color=0x8e82f9,
description=(
'# Sidestore Crashing After Refresh\n\n---\n\n' +
'1. Delete your current SideStore.\n' +
'2. Reinstall with AltServer.\n' +
'3. Select the pairing file and sign into SideStore.\n' +
'4. Download the SideStore .ipa file, and save it to your Files app.\n' +
'5. Import the "Sidestore.ipa" file into SideStore, just like how you import any other IPA.\n\n' +
'This process ensures SideStore is refreshed without issues.'
)
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
embed.set_footer(text=f'Last Edited by neoarz')
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/neos-helper-bot/blob/main/cogs/sidestore/crash.py",
emoji="<:githubicon:1417717356846776340>"
))
if context.interaction:
await context.interaction.response.send_message(embed=embed, view=view)
else:
await context.send(embed=embed, view=view)
async def setup(bot) -> None:
await bot.add_cog(Crash(bot))

62
cogs/sidestore/half.py Normal file
View File

@@ -0,0 +1,62 @@
import discord
from discord import app_commands
from discord.ext import commands
from discord.ext.commands import Context
import time
class Half(commands.Cog, name="half"):
def __init__(self, bot) -> None:
self.bot = bot
@commands.hybrid_command(
name="half", description="Help when apps get stuck installing"
)
async def half(self, context: Context) -> None:
embed = discord.Embed(
color=0x8e82f9,
description=(
'# Sidestore/IPAs Stuck Halfway Through Installing or Refreshing\n\n---\n' +
'### Method 1: Basic Troubleshooting\n\n' +
'- Restart SideStore\n' +
'- Restart device\n' +
'- Clear Cache\n' +
'- Change Anisette Server\n' +
'- Reset adi.pb\n' +
'- Sign out from SideStore and sign back in\n' +
'- Regenerate pairing file\n' +
'- Reinstall SideStore\n\n' +
'### Method 2: If Method 1 Doesn\'t Work\n\n' +
'1. Delete Sidestore\n' +
'2. Reinstall SideStore using the guide at https://docs.sidestore.io/\n' +
'3. **Do not use the IPA provided by the website**, instead use this older version: [Sidestore 0.5.9 download](https://github.com/SideStore/SideStore/releases/download/0.5.9/SideStore.ipa)\n' +
'4. Setup SideStore and StosVPN as usual\n' +
'> -# Step 3 is the important one (make sure to do that)\n'
)
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
embed.set_footer(text=f'Last Edited by neoarz')
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/neos-helper-bot/blob/main/cogs/sidestore/half.py",
emoji="<:githubicon:1417717356846776340>"
))
view.add_item(discord.ui.Button(
label="Documentation",
style=discord.ButtonStyle.primary,
url="https://docs.sidestore.io/docs/troubleshooting/common-issues#sidestore-hangs-halfway-through-installation",
emoji="<:sidestorepride:1417717648795631787>"
))
if context.interaction:
await context.interaction.response.send_message(embed=embed, view=view)
else:
await context.send(embed=embed, view=view)
async def setup(bot) -> None:
await bot.add_cog(Half(bot))

61
cogs/sidestore/pairing.py Normal file
View File

@@ -0,0 +1,61 @@
import discord
from discord import app_commands
from discord.ext import commands
from discord.ext.commands import Context
import time
class Pairing(commands.Cog, name="pairing"):
def __init__(self, bot) -> None:
self.bot = bot
@commands.hybrid_command(
name="pairing", description="Help with pairing file issues"
)
async def pairing(self, context: Context) -> None:
embed = discord.Embed(
color=0x8e82f9,
description=(
'# Cannot Choose Pairing File\n\n---\n\n' +
'1. **Check File Extension:**\n' +
" Make sure your pairing file's extension ends with `.mobiledevicepairing` or `.plist`\n" +
' - If it doesn\'t, double-check to see if you had zipped your pairing file before sending it to your phone. Failing to do so may lead to the file being corrupted during transport\n\n' +
'2. **Move Pairing File:**\n' +
' If you are unable to select the pairing file from within the app:\n' +
' - Rename the file to `ALTPairingFile.mobiledevicepairing`\n' +
' - Try moving the pairing file to the root directory of the SideStore folder in the Files app under "On My iPhone/iPad"\n\n' +
'3. **Certificate Signing:**\n' +
" When signing Sidestore with certain certificates, you won't be able to select the pairing file from within the app\n" +
' - Try the fix mentioned above\n' +
' - If you do not see the Sidestore folder in the Files app:\n' +
' • Connect your phone to your computer\n' +
' • Drag and drop the pairing file into the Sidestore app\'s files section\n' +
' • Ensure the file is renamed to `ALTPairingFile.mobiledevicepairing`\n'
)
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
embed.set_footer(text=f'Last Edited by neoarz')
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/pairing.py",
emoji="<:githubicon:1417717356846776340>"
))
view.add_item(discord.ui.Button(
label="Documentation",
style=discord.ButtonStyle.primary,
url="https://docs.sidestore.io/docs/troubleshooting/#cannot-choose-pairing-file",
emoji="<:sidestorepride:1417717648795631787>"
))
if context.interaction:
await context.interaction.response.send_message(embed=embed, view=view)
else:
await context.send(embed=embed, view=view)
async def setup(bot) -> None:
await bot.add_cog(Pairing(bot))

53
cogs/sidestore/refresh.py Normal file
View File

@@ -0,0 +1,53 @@
import discord
from discord import app_commands
from discord.ext import commands
from discord.ext.commands import Context
import time
class Refresh(commands.Cog, name="refresh"):
def __init__(self, bot) -> None:
self.bot = bot
@commands.hybrid_command(
name="refresh", description="Help with refreshing or installing apps"
)
async def refresh(self, context: Context) -> None:
embed = discord.Embed(
color=0x8e82f9,
description=(
'# Can\'t Refresh or Install Apps\n\n---\n\n' +
'1. Make sure your device is connected to a stable Wi-Fi network and not using cellular data.\n' +
'2. Verify VPN is connected in the StosVPN app.\n' +
'3. Turn off, then turn back on StosVPN, and wait a few seconds in Sidestore before trying to refresh.\n' +
'4. **Create a brand new pairing file.**\n' +
' - If none of the above worked, it is very likely that the pairing file is corrupted. You can reference the documentation on how to create a new pairing file [here](https://docs.sidestore.io/docs/troubleshooting/#cant-refresh-or-install-apps).\n' +
' - After creating a new pairing file, go to Sidestore settings and press "Reset pairing file," then choose the new pairing file you just created.\n'
)
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
embed.set_footer(text=f'Last Edited by neoarz')
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/refresh.py",
emoji="<:githubicon:1417717356846776340>"
))
view.add_item(discord.ui.Button(
label="Documentation",
style=discord.ButtonStyle.primary,
url="https://docs.sidestore.io/docs/troubleshooting/#cant-refresh-or-install-apps",
emoji="<:sidestorepride:1417717648795631787>"
))
if context.interaction:
await context.interaction.response.send_message(embed=embed, view=view)
else:
await context.send(embed=embed, view=view)
async def setup(bot) -> None:
await bot.add_cog(Refresh(bot))

55
cogs/sidestore/server.py Normal file
View File

@@ -0,0 +1,55 @@
import discord
from discord import app_commands
from discord.ext import commands
from discord.ext.commands import Context
import time
class Server(commands.Cog, name="server"):
def __init__(self, bot) -> None:
self.bot = bot
@commands.hybrid_command(
name="server", description="Help with anisette server issues"
)
async def server(self, context: Context) -> None:
embed = discord.Embed(
color=0x8e82f9,
description=(
'# Sidestore Freezing or Displaying an Error Code During Sign-In\n\n---\n\n' +
'1. **Change the Anisette Server:**\n' +
' The most common solution is to switch to a different Anisette server. Do this:\n' +
' - Open Sidestore settings\n' +
' - Scroll down to the "Anisette Server" option\n' +
' - Select a different server from the list\n' +
' - You might need to try a few servers from the list and find which works best for you\n\n' +
'2. **Host Your Own Anisette Server:**\n' +
' If you prefer, you can set up your own Anisette server. Detailed instructions for hosting an Anisette server are available in the official documentation and can be found [here](https://docs.sidestore.io/docs/advanced/anisette).\n\n'
)
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
embed.set_footer(text=f'Last Edited by neoarz')
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/server.py",
emoji="<:githubicon:1417717356846776340>"
))
view.add_item(discord.ui.Button(
label="Documentation",
style=discord.ButtonStyle.primary,
url="https://docs.sidestore.io/docs/troubleshooting/#sidestore-freezing-or-displaying-an-error-code-during-sign-in",
emoji="<:sidestorepride:1417717648795631787>"
))
if context.interaction:
await context.interaction.response.send_message(embed=embed, view=view)
else:
await context.send(embed=embed, view=view)
async def setup(bot) -> None:
await bot.add_cog(Server(bot))

105
cogs/sidestore/sidestore.py Normal file
View File

@@ -0,0 +1,105 @@
import discord
from discord import app_commands
from discord.ext import commands
from discord.ext.commands import Context
import time
class SidestoreSelect(discord.ui.Select):
def __init__(self, bot):
self.bot = bot
options = [
discord.SelectOption(
label="Refresh Issues",
value="refresh",
description="Help with refreshing or installing apps",
),
discord.SelectOption(
label="Verification Code",
value="code",
description="No code received when signing in with Apple ID",
),
discord.SelectOption(
label="App Crashes",
value="crash",
description="Help with SideStore crashing issues",
),
discord.SelectOption(
label="Pairing File",
value="pairing",
description="Help with pairing file issues",
),
discord.SelectOption(
label="Anisette Server",
value="server",
description="Help with anisette server issues",
),
discord.SelectOption(
label="Apps Stuck Halfway",
value="half",
description="Help when apps get stuck installing",
),
discord.SelectOption(
label="SparseRestore",
value="sparse",
description="Information about SparseRestore exploit",
)
]
super().__init__(placeholder="Choose a SideStore command...", options=options)
async def callback(self, interaction: discord.Interaction):
command_name = self.values[0]
command = self.bot.get_command(command_name)
if command:
ctx = await self.bot.get_context(interaction.message)
if ctx:
await ctx.invoke(command)
embed = discord.Embed(
title="Command Executed",
description=f"Successfully executed `/{command_name}`",
color=0x00FF00
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
await interaction.response.edit_message(embed=embed, view=None)
else:
embed = discord.Embed(
title="Error",
description="Command not found!",
color=0xFF0000
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
await interaction.response.edit_message(embed=embed, view=None)
class SidestoreView(discord.ui.View):
def __init__(self, bot):
super().__init__()
self.add_item(SidestoreSelect(bot))
class Sidestore(commands.Cog, name="sidestore"):
def __init__(self, bot) -> None:
self.bot = bot
@commands.hybrid_command(
name="sidestore", description="SideStore troubleshooting and help"
)
async def sidestore(self, context: Context) -> None:
embed = discord.Embed(
title="SideStore Commands",
description="Choose a command from the dropdown below to get help with specific issues:",
color=0x8e82f9
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
view = SidestoreView(self.bot)
if context.interaction:
await context.interaction.response.send_message(embed=embed, view=view, ephemeral=True)
else:
await context.send(embed=embed, view=view)
async def setup(bot) -> None:
await bot.add_cog(Sidestore(bot))

50
cogs/sidestore/sparse.py Normal file
View File

@@ -0,0 +1,50 @@
import discord
from discord import app_commands
from discord.ext import commands
from discord.ext.commands import Context
import time
class Sparse(commands.Cog, name="sparse"):
def __init__(self, bot) -> None:
self.bot = bot
@commands.hybrid_command(
name="sparse", description="Information about SparseRestore exploit"
)
async def sparse(self, context: Context) -> None:
embed = discord.Embed(
color=0x8e82f9,
description=(
'# SparseRestore "Bypass 3 App Limit" Exploit\n\n---\n\n' +
'The SparseRestore exploit allows you to bypass the 3-app sideloading limit. It is compatible with iOS/iPadOS versions **15.2 to 18.1 beta 4**, (not including **17.7.1** and **17.7.2**).\n\n' +
'iOS/iPadOS versions **17.0** (not including **16.7** and **16.7.10**) are recommended to use [Trollstore](https://ios.cfw.guide/installing-trollstore/)\n\n' +
'If you\'re on a supported version and want to sideload more than three apps, follow the detailed instructions found in our documentation'
)
)
embed.set_author(name="SideStore", icon_url="https://github.com/SideStore/assets/blob/main/icons/classic/Default.png?raw=true")
embed.set_footer(text=f'Last Edited by neoarz')
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/sparse.py",
emoji="<:githubicon:1417717356846776340>"
))
view.add_item(discord.ui.Button(
label="Documentation",
style=discord.ButtonStyle.primary,
url="https://docs.sidestore.io/docs/advanced/sparserestore",
emoji="<:sidestorepride:1417717648795631787>"
))
if context.interaction:
await context.interaction.response.send_message(embed=embed, view=view)
else:
await context.send(embed=embed, view=view)
async def setup(bot) -> None:
await bot.add_cog(Sparse(bot))