diff --git a/cogs/general/help.py b/cogs/general/help.py index 3f07dc5..8a0788a 100644 --- a/cogs/general/help.py +++ b/cogs/general/help.py @@ -13,7 +13,7 @@ class Help(commands.Cog, name="help"): interaction: discord.Interaction, current: str, ) -> list[app_commands.Choice[str]]: - categories = ["general", "fun", "moderation", "template", "owner"] + categories = ["general", "fun", "moderation", "template", "owner", "sidestore"] suggestions = [] for category in categories: @@ -56,6 +56,15 @@ class Help(commands.Cog, name="help"): "warnings": "moderation", "archive": "moderation", + "sidestore": "sidestore", + "refresh": "sidestore", + "code": "sidestore", + "crash": "sidestore", + "pairing": "sidestore", + "server": "sidestore", + "half": "sidestore", + "sparse": "sidestore", + "sync": "owner", "cog_management": "owner", "shutdown": "owner", @@ -68,7 +77,8 @@ class Help(commands.Cog, name="help"): "fun": "Funny commands", "moderation": "Administration commands", "template": "Template commands", - "owner": "Owner commands" + "owner": "Owner commands", + "sidestore": "SideStore troubleshooting commands" } if category is None: diff --git a/cogs/idevice/idevice.py b/cogs/idevice/idevice.py new file mode 100644 index 0000000..5360f64 --- /dev/null +++ b/cogs/idevice/idevice.py @@ -0,0 +1,3 @@ +async def setup(bot) -> None: + pass + diff --git a/cogs/sidestore/code.py b/cogs/sidestore/code.py new file mode 100644 index 0000000..4690f20 --- /dev/null +++ b/cogs/sidestore/code.py @@ -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)) diff --git a/cogs/sidestore/crash.py b/cogs/sidestore/crash.py new file mode 100644 index 0000000..2bfd06f --- /dev/null +++ b/cogs/sidestore/crash.py @@ -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)) diff --git a/cogs/sidestore/half.py b/cogs/sidestore/half.py new file mode 100644 index 0000000..afab7e6 --- /dev/null +++ b/cogs/sidestore/half.py @@ -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)) diff --git a/cogs/sidestore/pairing.py b/cogs/sidestore/pairing.py new file mode 100644 index 0000000..4015004 --- /dev/null +++ b/cogs/sidestore/pairing.py @@ -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)) diff --git a/cogs/sidestore/refresh.py b/cogs/sidestore/refresh.py new file mode 100644 index 0000000..d33f390 --- /dev/null +++ b/cogs/sidestore/refresh.py @@ -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)) diff --git a/cogs/sidestore/server.py b/cogs/sidestore/server.py new file mode 100644 index 0000000..13a647f --- /dev/null +++ b/cogs/sidestore/server.py @@ -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)) diff --git a/cogs/sidestore/sidestore.py b/cogs/sidestore/sidestore.py new file mode 100644 index 0000000..b09f44d --- /dev/null +++ b/cogs/sidestore/sidestore.py @@ -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)) diff --git a/cogs/sidestore/sparse.py b/cogs/sidestore/sparse.py new file mode 100644 index 0000000..e23c837 --- /dev/null +++ b/cogs/sidestore/sparse.py @@ -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))