Add basic starboard, needs more work later. Closes #8

This commit is contained in:
Zeva Rose 2021-06-30 23:43:03 -06:00
parent a89e9170dc
commit 0eb1b05d4b
10 changed files with 340 additions and 41 deletions

View file

@ -1,10 +1,10 @@
import jarvis import jarvis
from datetime import datetime
from discord import User from discord import User
from discord.ext import commands from discord.ext import commands
from discord_slash import cog_ext, SlashContext from discord_slash import cog_ext
from discord_slash.utils.manage_commands import create_option, create_choice from discord_slash.utils.manage_commands import create_option, create_choice
from jarvis.utils.db import DBManager from jarvis.utils.db import DBManager
from datetime import datetime
class AdminCog(commands.Cog): class AdminCog(commands.Cog):

View file

@ -1,13 +1,9 @@
import jarvis
import re
import aiohttp import aiohttp
from jarvis.config import get_config import jarvis
from jarvis.utils import build_embed
from jarvis.utils.db import DBManager
from jarvis.utils.field import Field
from jarvis.data.dbrand import shipping_lookup
from discord.ext import commands from discord.ext import commands
from discord_slash import cog_ext from discord_slash import cog_ext
from jarvis.config import get_config
from jarvis.utils.db import DBManager
class CTCCog(commands.Cog): class CTCCog(commands.Cog):

View file

@ -1,13 +1,13 @@
import aiohttp
import jarvis import jarvis
import re import re
import aiohttp
from jarvis.config import get_config
from jarvis.utils import build_embed
from jarvis.utils.field import Field
from jarvis.data.dbrand import shipping_lookup
from discord.ext import commands from discord.ext import commands
from discord_slash import cog_ext from discord_slash import cog_ext
from discord_slash.utils.manage_commands import create_option from discord_slash.utils.manage_commands import create_option
from jarvis.config import get_config
from jarvis.data.dbrand import shipping_lookup
from jarvis.utils import build_embed
from jarvis.utils.field import Field
class DbrandCog(commands.Cog): class DbrandCog(commands.Cog):

View file

@ -1,22 +1,21 @@
import jarvis
import hashlib
import uuid
import re
import ulid
import base64 import base64
import subprocess
import discord import discord
import sys import hashlib
import jarvis
import os import os
import re
import subprocess
import sys
import traceback import traceback
from time import time import ulid
from inspect import getsource import uuid
from bson import ObjectId
from discord.ext import commands from discord.ext import commands
from discord_slash import cog_ext from discord_slash import cog_ext
from jarvis.utils import build_embed, convert_bytesize from inspect import getsource
from jarvis.utils import build_embed, convert_bytesize, user_is_bot_admin
from jarvis.utils.field import Field from jarvis.utils.field import Field
from bson import ObjectId from time import time
from jarvis.utils import user_is_bot_admin
supported_hashes = { supported_hashes = {

View file

@ -1,13 +1,13 @@
import jarvis
from discord import File
import cv2
import aiohttp import aiohttp
import re import cv2
import jarvis
import numpy as np import numpy as np
from jarvis.utils import convert_bytesize, unconvert_bytesize, build_embed import re
from jarvis.utils.field import Field from discord import File
from discord.ext import commands from discord.ext import commands
from io import BytesIO from io import BytesIO
from jarvis.utils import convert_bytesize, unconvert_bytesize, build_embed
from jarvis.utils.field import Field
class ImageCog(commands.Cog): class ImageCog(commands.Cog):

View file

@ -1,15 +1,15 @@
import jarvis
import discord import discord
from random import randint
import html import html
import jarvis
import re import re
import traceback import traceback
from datetime import datetime
from discord.ext import commands
from discord_slash import cog_ext
from jarvis.utils import build_embed from jarvis.utils import build_embed
from jarvis.utils.db import DBManager from jarvis.utils.db import DBManager
from jarvis.utils.field import Field from jarvis.utils.field import Field
from discord.ext import commands from random import randint
from discord_slash import cog_ext
from datetime import datetime
class JokeCog(commands.Cog): class JokeCog(commands.Cog):

View file

@ -1,5 +1,5 @@
import jarvis
import discord import discord
import jarvis
from discord import User from discord import User
from discord.ext import commands from discord.ext import commands
from jarvis.config import get_config, reload_config from jarvis.config import get_config, reload_config

303
jarvis/cogs/starboard.py Normal file
View file

@ -0,0 +1,303 @@
import aiohttp
import jarvis
from datetime import datetime
import discord
from discord import TextChannel, Message
from discord.ext import commands
from discord.utils import find
from discord_slash import cog_ext, SlashContext
from discord_slash.utils.manage_commands import create_option
from jarvis.config import get_config
from jarvis.utils import build_embed
from jarvis.utils.db import DBManager
from jarvis.utils.field import Field
class StarboardCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.db = DBManager(get_config().mongo).mongo
@cog_ext.cog_subcommand(
base="starboard",
name="list",
description="Lists all Starboards",
guild_ids=[418094694325813248, 578757004059738142],
)
async def _list(self, ctx):
starboards = [
x for x in self.db.jarvis.starboard.find({"guild": ctx.guild.id})
]
if starboards != []:
message = "Available Starboards:\n"
for s in starboards:
message += f"{s['name']}: <#{s['target']}>\n"
await ctx.send(message)
else:
await ctx.send("No Starboards available.")
@cog_ext.cog_subcommand(
base="starboard",
name="create",
description="Create a starboard",
guild_ids=[418094694325813248, 578757004059738142],
options=[
create_option(
name="name",
description="Starboard name",
option_type=3,
required=True,
),
create_option(
name="target",
description="Target channel",
option_type=7,
required=True,
),
],
)
async def _create(self, ctx, name: str, target: TextChannel):
if target not in ctx.guild.channels:
await ctx.send(
"Target channel not in guild. Choose an existing channel."
)
return
exists = self.db.jarvis.starboard.find_one(
{"name": name, "guild": ctx.guild.id}
)
if exists:
await ctx.send(
f"Starboard {name} already exists at <@{exists['channel']}>!"
)
return
self.db.jarvis.starboard.insert_one(
{
"name": name,
"guild": ctx.guild.id,
"target": target.id,
"admin": ctx.author.id,
"time": datetime.now(),
}
)
await ctx.send(
f"Starboard `{name}` created! Check it out at {target.mention}."
)
@cog_ext.cog_subcommand(
base="starboard",
name="delete",
description="Delete a starboard",
guild_ids=[418094694325813248, 578757004059738142],
options=[
create_option(
name="name",
description="Starboard name",
option_type=3,
required=True,
),
],
)
async def _delete(self, ctx, name: str):
deleted = self.db.jarvis.starboard.delete_one(
{
"name": name,
"guild": ctx.guild.id,
}
)
if deleted:
self.db.jarvis.stars.delete_many({"starboard": name})
await ctx.send(f"Starboard `{name}` deleted!")
else:
await ctx.send(f"Starboard `{name}` not found!")
@cog_ext.cog_subcommand(
base="starboard",
name="move",
description="Move a starboard",
guild_ids=[418094694325813248, 578757004059738142],
options=[
create_option(
name="name",
description="Starboard name",
option_type=3,
required=True,
),
create_option(
name="target",
description="New Starboard channel",
option_type=7,
required=True,
),
],
)
async def _move(self, ctx, name: str, target: TextChannel):
exists = self.db.jarvis.starboard.find_one(
{
"name": name,
"guild": ctx.guild.id,
}
)
if not exists:
await ctx.send(
f"Good news! Starboard `{name}` doesn't exist!\n"
+ f"Run `/starboard create {name} {target.mention}` "
+ "to create it!"
)
return
exists["target"] = target.id
self.db.jarvis.starboard.update_one(
{"_id": exists["_id"]}, {"$set": exists}
)
await ctx.send(f"Starboard `{name}` moved to {target.mention}!")
@cog_ext.cog_subcommand(
base="starboard",
name="rename",
description="Move a starboard",
guild_ids=[418094694325813248, 578757004059738142],
options=[
create_option(
name="name",
description="Starboard name",
option_type=3,
required=True,
),
create_option(
name="new",
description="New Starboard name",
option_type=3,
required=True,
),
],
)
async def _rename(self, ctx, name: str, new: str):
old_exists = self.db.jarvis.starboard.find_one(
{"name": name, "guild": ctx.guild.id}
)
if not old_exists:
await ctx.send(
f"Good news! Starboard `{name}` doesn't exist!\n"
+ f"Run `/starboard create {new} <target channel>` "
+ "to create your new channel!"
)
return
new_exists = self.db.jarvis.starboard.find_one(
{"name": new, "guild": ctx.guild.id}
)
if new_exists:
await ctx.send(f"Starboard `{new}` already exists!")
return
old_exists["name"] = new
self.db.jarvis.starboard.update_one(
{"_id": old_exists["_id"]}, {"$set": old_exists}
)
await ctx.send(f"Starboard `{name}` moved renamed to `{name}`!")
@cog_ext.cog_subcommand(
base="star",
name="add",
description="Star a message",
guild_ids=[418094694325813248, 578757004059738142],
options=[
create_option(
name="message",
description="Message to star",
option_type=3,
required=True,
),
create_option(
name="starboard",
description="Starboard to send message to",
option_type=3,
required=True,
),
create_option(
name="channel",
description="Channel that has the message, "
+ "required if different than command message",
option_type=7,
required=False,
),
],
)
async def _star_add(
self,
ctx: SlashContext,
message: str,
starboard: str,
channel: TextChannel = None,
):
if not channel:
channel = ctx.channel
exists = self.db.jarvis.starboard.find_one(
{"name": starboard, "guild": ctx.guild.id}
)
if not exists:
await ctx.send(
f"Starboard `{starboard}` does not exist! "
+ "Please create it first"
)
return
message = await channel.fetch_message(int(message))
guild_channels = await ctx.guild.fetch_channels()
target = find(lambda x: x.id == exists["target"], guild_channels)
if not target:
await ctx.send("Could not find Starboard channel!")
return
exists = self.db.jarvis.stars.find_one(
{
"message": message.id,
"channel": message.channel.id,
"guild": message.guild.id,
"starboard": starboard,
}
)
if exists:
await ctx.send(f"Message already sent to Starboard `{starboard}`!")
return
content = message.content
embed = build_embed(
title="Click Here to view context",
description=content,
fields=[],
url=message.jump_url,
)
embed.set_author(
name=message.author.name,
url=message.jump_url,
icon_url=message.author.avatar_url,
)
embed.set_footer(
text=message.guild.name + " | " + message.channel.name
)
star = await target.send(embed=embed)
self.db.jarvis.stars.insert_one(
{
"message": message.id,
"channel": message.channel.id,
"guild": message.guild.id,
"starboard": starboard,
"admin": ctx.author.id,
"time": datetime.now(),
"star": star.id,
}
)
await ctx.send(
f"Message saved to Starboard `{starboard}`!\n"
+ f"See it in {target.mention}"
)
def setup(bot):
bot.add_cog(StarboardCog(bot))

View file

@ -1,9 +1,9 @@
import jarvis import jarvis
from discord.ext import commands
from discord_slash import cog_ext
from jarvis import jarvis_self, config, logo from jarvis import jarvis_self, config, logo
from jarvis.utils import convert_bytesize, build_embed, get_repo_hash from jarvis.utils import convert_bytesize, build_embed, get_repo_hash
from jarvis.utils.field import Field from jarvis.utils.field import Field
from discord.ext import commands
from discord_slash import cog_ext, SlashContext
class UtilCog(commands.Cog): class UtilCog(commands.Cog):

View file

@ -70,8 +70,9 @@ jarvis:
time: datetime time: datetime
starboard: starboard:
name: String, name of starboard
guild: Guild ID guild: Guild ID
channel: Channel ID target: Channel ID, target channel
admin: User ID, admin who created admin: User ID, admin who created
time: Datetime time: Datetime