rewrite speech bubble
This commit is contained in:
parent
9652f7f8b6
commit
3420904ade
1 changed files with 110 additions and 87 deletions
197
speechbubble.py
197
speechbubble.py
|
@ -1,66 +1,113 @@
|
||||||
import disnake
|
import nextcord
|
||||||
from disnake.ext import commands
|
from nextcord.ext import commands
|
||||||
from disnake import TextInputStyle
|
from nextcord import TextInputStyle
|
||||||
from dotenv import load_dotenv
|
|
||||||
from random import randint
|
from random import randint
|
||||||
import aiosqlite as sqlite3
|
import aiosqlite as sqlite3
|
||||||
import aiohttp
|
import aiohttp
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
import os
|
import os
|
||||||
|
|
||||||
class ApplicationModal(disnake.ui.Modal):
|
|
||||||
def __init__(self, user):
|
|
||||||
self.victim = user
|
|
||||||
components = [
|
|
||||||
disnake.ui.TextInput(
|
|
||||||
label="link to image",
|
|
||||||
placeholder="https://media.discordapp.net/goofyimg.png",
|
|
||||||
custom_id="image",
|
|
||||||
style=TextInputStyle.short,
|
|
||||||
max_length=400,
|
|
||||||
),
|
|
||||||
disnake.ui.TextInput(
|
|
||||||
label="chance: a 1 in x chance",
|
|
||||||
placeholder="10",
|
|
||||||
custom_id="chance: a 1 in x chance",
|
|
||||||
style=TextInputStyle.short,
|
|
||||||
max_length=5,
|
|
||||||
),
|
|
||||||
]
|
|
||||||
super().__init__(title=f"create a speechbubble for {user.name}", components=components)
|
|
||||||
|
|
||||||
async def callback(self, inter: disnake.ModalInteraction):
|
class ApplicationView(nextcord.ui.View):
|
||||||
speechbubble = inter.text_values.items()
|
def __init__(self,bot):
|
||||||
embed = disnake.Embed(title="New speech bubble!", color=disnake.Colour.green())
|
super().__init__(timeout=None)
|
||||||
|
self.bot = bot
|
||||||
|
|
||||||
|
@nextcord.ui.button(
|
||||||
|
label="Approve", style=nextcord.ButtonStyle.green, custom_id="speechbubble:approve"
|
||||||
|
)
|
||||||
|
async def approve(self, button: nextcord.ui.Button, interaction: nextcord.Interaction):
|
||||||
|
ogmsg = interaction.message.embeds
|
||||||
|
embed = ogmsg[0]
|
||||||
|
if interaction.user.id != int(embed.fields[0].value):
|
||||||
|
await interaction.response.send_message("you may not modify this speech bubble!", ephemeral=True)
|
||||||
|
return
|
||||||
|
embed.add_field(
|
||||||
|
name="Status",
|
||||||
|
value="Approved",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
await self.bot.cur.execute(f"""
|
||||||
|
INSERT INTO userinfo VALUES
|
||||||
|
({interaction.guild_id}, {int(embed.fields[0].value)}, '{embed.fields[1].value}', {int(embed.fields[2].value)})
|
||||||
|
""")
|
||||||
|
await self.bot.db.commit()
|
||||||
|
await interaction.response.edit_message(embed=embed, view=None)
|
||||||
|
return
|
||||||
|
|
||||||
|
@nextcord.ui.button(
|
||||||
|
label="Deny", style=nextcord.ButtonStyle.red, custom_id="speechbubble:deny"
|
||||||
|
)
|
||||||
|
async def deny(self, button: nextcord.ui.Button, interaction: nextcord.Interaction):
|
||||||
|
ogmsg = interaction.message.embeds
|
||||||
|
embed = ogmsg[0]
|
||||||
|
if interaction.user.id != int(embed.fields[0].value):
|
||||||
|
await interaction.response.send_message("you may not modify this speech bubble!", ephemeral=True)
|
||||||
|
return
|
||||||
|
embed.add_field(
|
||||||
|
name="Status",
|
||||||
|
value="Denied",
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
await interaction.response.edit_message(embed=embed, view=None)
|
||||||
|
return
|
||||||
|
|
||||||
|
class ApplicationModal(nextcord.ui.Modal):
|
||||||
|
def __init__(self,user,bot):
|
||||||
|
self.victim = user
|
||||||
|
self.bot = bot
|
||||||
|
super().__init__(
|
||||||
|
f"create a speechbubble for {user.name}"
|
||||||
|
)
|
||||||
|
|
||||||
|
self.image = nextcord.ui.TextInput(
|
||||||
|
label="link to image",
|
||||||
|
placeholder="https://media.discordapp.net/goofyimg.png",
|
||||||
|
style=TextInputStyle.short,
|
||||||
|
max_length=400,
|
||||||
|
)
|
||||||
|
self.add_item(self.image)
|
||||||
|
|
||||||
|
self.chance = nextcord.ui.TextInput(
|
||||||
|
label="chance: a 1 in x chance",
|
||||||
|
placeholder="10",
|
||||||
|
style=TextInputStyle.short,
|
||||||
|
max_length=5,
|
||||||
|
)
|
||||||
|
self.add_item(self.chance)
|
||||||
|
|
||||||
|
async def callback(self, interaction: nextcord.Interaction) -> None:
|
||||||
|
embed = nextcord.Embed(title="New speech bubble!", color=nextcord.Colour.green())
|
||||||
embed.add_field(
|
embed.add_field(
|
||||||
name="User ID",
|
name="User ID",
|
||||||
value=self.victim.id,
|
value=self.victim.id,
|
||||||
inline=False,
|
inline=False,
|
||||||
)
|
)
|
||||||
for key, value in speechbubble:
|
print(self.image.value)
|
||||||
if key == "image":
|
if urlparse(self.image.value).netloc != 'media.discordapp.net' and urlparse(self.image.value).netloc != 'cdn.discordapp.com':
|
||||||
if urlparse(value).netloc != 'media.discordapp.net' and urlparse(value).netloc != 'cdn.discordapp.com':
|
await interaction.send_message(f"for security reasons, the bot only accepts images from media.discordapp.net or cdn.discordapp.com", ephemeral=True)
|
||||||
await inter.response.send_message(f"for security reasons, the bot only accepts images from media.discordapp.net or cdn.discordapp.com", ephemeral=True)
|
return
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
async with session.get(self.image.value) as response:
|
||||||
|
if (response.status == 200) and (response.headers['content-type'] == "image/png" or response.headers['content-type'] == "image/jpeg" or response.headers['content-type'] == "image/jpg"):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
await interaction.send(f"you did not supply an image {response.status} {response.headers['content-type']}", ephemeral=True)
|
||||||
return
|
return
|
||||||
async with aiohttp.ClientSession() as session:
|
if not self.chance.value.isdigit():
|
||||||
async with session.get(value) as response:
|
await interaction.send("you supplied words for a number", ephemeral=True)
|
||||||
if (response.status == 200) and (response.headers['content-type'] == "image/png" or response.headers['content-type'] == "image/jpeg" or response.headers['content-type'] == "image/jpg"):
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
await inter.response.send_message(f"you did not supply an image {response.status} {response.headers['content-type']}", ephemeral=True)
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
if not value.isdigit():
|
|
||||||
await inter.response.send_message("you supplied words for a number", ephemeral=True)
|
|
||||||
return
|
return
|
||||||
embed.add_field(
|
embed.add_field(
|
||||||
name=key,
|
name="Image",
|
||||||
value=value,
|
value=self.image.value,
|
||||||
inline=False,
|
inline=False,
|
||||||
)
|
)
|
||||||
await inter.response.send_message(f"<@{self.victim.id}> {inter.user.name} proposes the following speech bubble for you:", embed=embed, components=[
|
embed.add_field(
|
||||||
disnake.ui.Button(label="Approve", style=disnake.ButtonStyle.success, custom_id="Approve"),
|
name="Chance, a 1 in x chance",
|
||||||
disnake.ui.Button(label="Deny", style=disnake.ButtonStyle.danger, custom_id="Deny"),],)
|
value=self.chance.value,
|
||||||
|
inline=False,
|
||||||
|
)
|
||||||
|
await interaction.send(f"<@{self.victim.id}> {interaction.user.name} proposes the following speech bubble for you:", embed=embed, view=ApplicationView(self.bot))
|
||||||
|
|
||||||
|
|
||||||
class speechbubble(commands.Cog):
|
class speechbubble(commands.Cog):
|
||||||
|
@ -68,34 +115,9 @@ class speechbubble(commands.Cog):
|
||||||
def __init__(self, bot: commands.Bot):
|
def __init__(self, bot: commands.Bot):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
@commands.Cog.listener("on_button_click")
|
@commands.Cog.listener('on_ready')
|
||||||
async def button_listener(self, inter: disnake.MessageInteraction):
|
async def ready(self):
|
||||||
ogmsg = inter.message.embeds
|
self.add_view(ApplicationView())
|
||||||
embed = ogmsg[0]
|
|
||||||
if inter.user.id != int(embed.fields[0].value):
|
|
||||||
await inter.response.send_message("you may not modify this speech bubble!", ephemeral=True)
|
|
||||||
return
|
|
||||||
if inter.component.custom_id == "Approve":
|
|
||||||
embed.add_field(
|
|
||||||
name="Status",
|
|
||||||
value="Approved",
|
|
||||||
inline=False,
|
|
||||||
)
|
|
||||||
await inter.response.edit_message(embed=embed, components=[])
|
|
||||||
await self.bot.cur.execute(f"""
|
|
||||||
INSERT INTO userinfo VALUES
|
|
||||||
({inter.guild_id}, {int(embed.fields[0].value)}, '{embed.fields[1].value}', {int(embed.fields[2].value)})
|
|
||||||
""")
|
|
||||||
await self.bot.db.commit()
|
|
||||||
return
|
|
||||||
if inter.component.custom_id == "Deny":
|
|
||||||
embed.add_field(
|
|
||||||
name="Status",
|
|
||||||
value="Denied",
|
|
||||||
inline=False,
|
|
||||||
)
|
|
||||||
await inter.response.edit_message(embed=embed, components=[])
|
|
||||||
return
|
|
||||||
|
|
||||||
@commands.Cog.listener('on_message')
|
@commands.Cog.listener('on_message')
|
||||||
async def on_message(self,message):
|
async def on_message(self,message):
|
||||||
|
@ -107,27 +129,28 @@ class speechbubble(commands.Cog):
|
||||||
if randint(1, chance) == 1:
|
if randint(1, chance) == 1:
|
||||||
await message.channel.send(imagelink)
|
await message.channel.send(imagelink)
|
||||||
|
|
||||||
@commands.slash_command(
|
@nextcord.slash_command(
|
||||||
name="create",
|
name="create",
|
||||||
description="create a speech bubble for a user",
|
description="create a speech bubble for a user",
|
||||||
)
|
)
|
||||||
async def create(self, inter: disnake.ApplicationCommandInteraction, victim: disnake.Member = commands.Param(name="victim")):
|
async def create(self, interaction: nextcord.Interaction, victim: nextcord.Member = nextcord.SlashOption(name="victim")):
|
||||||
if inter.user.id == victim.id:
|
if interaction.user.id == victim.id:
|
||||||
await inter.response.send_message("you may not assign yourself a speech bubble, try someone else!", ephemeral=True)
|
await interaction.response.send_message("you may not assign yourself a speech bubble, try someone else!", ephemeral=True)
|
||||||
return
|
return
|
||||||
await inter.response.send_modal(modal=ApplicationModal(victim))
|
await interaction.response.send_modal(ApplicationModal(victim,self.bot))
|
||||||
|
|
||||||
@commands.slash_command(
|
@nextcord.slash_command(
|
||||||
name="removeme",
|
name="removeme",
|
||||||
description="Removes you from the database",
|
description="Removes you from the database",
|
||||||
|
guild_ids=[732793772697583623],
|
||||||
)
|
)
|
||||||
async def removeme(self, inter: disnake.ApplicationCommandInteraction, universal: str = commands.Param(choices=["yes", "no"])):
|
async def removeme(self, interaction: nextcord.Interaction, universal: str = nextcord.SlashOption(choices=["yes", "no"])):
|
||||||
if universal == "yes":
|
if universal == "yes":
|
||||||
await self.bot.cur.execute(f"DELETE FROM userinfo WHERE userid = {inter.user.id}")
|
await self.bot.cur.execute(f"DELETE FROM userinfo WHERE userid = {interaction.user.id}")
|
||||||
elif universal == "no":
|
elif universal == "no":
|
||||||
await self.bot.cur.execute(f"DELETE FROM userinfo WHERE userid = {inter.user.id} AND serverid = {inter.guild_id}")
|
await self.bot.cur.execute(f"DELETE FROM userinfo WHERE userid = {interaction.user.id} AND serverid = {interaction.guild_id}")
|
||||||
await self.bot.db.commit()
|
await self.bot.db.commit()
|
||||||
await inter.response.send_message("Done!", ephemeral=True)
|
await interaction.response.send_message("Done!", ephemeral=True)
|
||||||
|
|
||||||
def setup(bot: commands.Bot):
|
def setup(bot: commands.Bot):
|
||||||
bot.add_cog(speechbubble(bot))
|
bot.add_cog(speechbubble(bot))
|
Loading…
Reference in a new issue