Skip to content

Commit 133615f

Browse files
committed
Add a plugin registry
1 parent 0d48e56 commit 133615f

File tree

1 file changed

+53
-2
lines changed

1 file changed

+53
-2
lines changed

cogs/plugins.py

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@
66
import stat
77
import subprocess
88
import sys
9+
import json
10+
from pkg_resources import parse_version
911

12+
import discord
1013
from discord.ext import commands
1114
from discord.utils import async_all
1215

1316
from core import checks
1417
from core.models import PermissionLevel
1518
from core.utils import info, error
19+
from core.paginator import PaginatorSession
1620

1721
logger = logging.getLogger('Modmail')
1822

@@ -33,6 +37,8 @@ class Plugins(commands.Cog):
3337
def __init__(self, bot):
3438
self.bot = bot
3539
self.bot.loop.create_task(self.download_initial_plugins())
40+
with open('plugins/registry.json') as f:
41+
self.registry = json.load(f)
3642

3743
@staticmethod
3844
def _asubprocess_run(cmd):
@@ -128,6 +134,12 @@ async def plugin(self, ctx):
128134
@checks.has_permissions(PermissionLevel.OWNER)
129135
async def plugin_add(self, ctx, *, plugin_name: str):
130136
"""Add a plugin."""
137+
if plugin_name in self.registry:
138+
info = self.registry[plugin_name]
139+
plugin_name = info['repository'] + '/' + plugin_name
140+
required_version = info['bot_version']
141+
if parse_version(self.bot.version) < parse_version(required_version):
142+
return await ctx.send(f"Bot version too low, plugin requires version `{required_version}`")
131143
if plugin_name in self.bot.config.plugins:
132144
return await ctx.send('Plugin already installed.')
133145
if plugin_name in self.bot.cogs.keys():
@@ -168,6 +180,9 @@ async def plugin_add(self, ctx, *, plugin_name: str):
168180
@checks.has_permissions(PermissionLevel.OWNER)
169181
async def plugin_remove(self, ctx, *, plugin_name: str):
170182
"""Remove a plugin."""
183+
if plugin_name in self.registry:
184+
info = self.registry[plugin_name]
185+
plugin_name = info['repository'] + '/' + plugin_name
171186
if plugin_name in self.bot.config.plugins:
172187
username, repo, name = self.parse_plugin(plugin_name)
173188
self.bot.unload_extension(
@@ -203,6 +218,9 @@ def onerror(func, path, exc_info): # pylint: disable=W0613
203218
@checks.has_permissions(PermissionLevel.OWNER)
204219
async def plugin_update(self, ctx, *, plugin_name: str):
205220
"""Update a plugin."""
221+
if plugin_name in self.registry:
222+
info = self.registry[plugin_name]
223+
plugin_name = info['repository'] + '/' + plugin_name
206224
if plugin_name not in self.bot.config.plugins:
207225
return await ctx.send('Plugin not installed.')
208226

@@ -232,16 +250,49 @@ async def plugin_update(self, ctx, *, plugin_name: str):
232250
except DownloadError as exc:
233251
await ctx.send(f'Unable to start plugin: `{exc}`.')
234252

235-
@plugin.command(name='list', aliases=['show', 'view'])
253+
@plugin.command(name='enabled')
236254
@checks.has_permissions(PermissionLevel.OWNER)
237-
async def plugin_list(self, ctx):
255+
async def plugin_enabled(self, ctx):
238256
"""Shows a list of currently enabled plugins."""
239257
if self.bot.config.plugins:
240258
msg = '```\n' + '\n'.join(self.bot.config.plugins) + '\n```'
241259
await ctx.send(msg)
242260
else:
243261
await ctx.send('No plugins installed.')
244262

263+
@plugin.command(name='registry', aliases=['list'])
264+
@checks.has_permissions(PermissionLevel.OWNER)
265+
async def plugin_registry(self, ctx):
266+
"""Shows a list of all approved plugins."""
267+
268+
embeds = []
269+
270+
for name, info in self.registry.items():
271+
repo = f"https://github.com/{info['repository']}"
272+
273+
em = discord.Embed(
274+
color=self.bot.main_color,
275+
description=info['description'],
276+
url=repo,
277+
title=info['repository']
278+
)
279+
280+
em.add_field(
281+
name='Installation',
282+
value=f'```{self.bot.prefix}plugins add {name}```')
283+
284+
em.set_author(name=info['title'], icon_url=info.get('icon_url'))
285+
if info.get('thumbnail_url'):
286+
em.set_thumbnail(url=info.get('thumbnail_url'))
287+
288+
embeds.append(em)
289+
290+
paginator = PaginatorSession(ctx, *embeds)
291+
await paginator.run()
292+
293+
294+
295+
245296

246297
def setup(bot):
247298
bot.add_cog(Plugins(bot))

0 commit comments

Comments
 (0)