This commit is contained in:
tmddn3070 2023-12-03 19:06:21 +09:00
parent 369fe4829c
commit fd2336a555
13 changed files with 189 additions and 39 deletions

View File

@ -1,33 +1,53 @@
import io import io
from discord import SlashCommandGroup, Option, Member, Color, File, Attachment from discord import SlashCommandGroup, Option, Member, Color, File, Attachment
from discord.utils import basic_autocomplete
from discord.ext.commands import Cog, BucketType, cooldown, guild_only, Context, has_permissions from discord.ext.commands import Cog, BucketType, cooldown, guild_only, Context, has_permissions
from Christmas.Database import database from Christmas.Database import database
from Christmas.UI.Embed import ChristmasEmbed, Arcade_Embed, Default_Embed from Christmas.UI.Embed import ChristmasEmbed, Arcade_Embed, Default_Embed
from Christmas.UI.Buttons import Arcade_Register_Agree from Christmas.UI.Buttons import Arcade_Register_Agree
from Christmas.Cogs.Event import model from Christmas.Cogs.Event import model
from Christmas.UI.AutoComplete import Guild_Autocomplete
class CArcade(Cog): class CArcade(Cog):
def __init__(self, bot): def __init__(self, bot):
self.bot = bot self.bot = bot
ARCADE = SlashCommandGroup(name="눈싸움", description="눈싸움 관련 명령어") #ARCADE = SlashCommandGroup(name="눈싸움", description="눈싸움 관련 명령어")
#
@cooldown(1, 5, BucketType.user) # @cooldown(1, 5, BucketType.user)
@has_permissions(administrator=True) # @has_permissions(administrator=True)
@guild_only() # @guild_only()
@ARCADE.command(name="등록", description="눈싸움 등록") # @ARCADE.command(name="등록", description="눈싸움 등록")
async def _등록(self, ctx: Context): # async def _등록(self, ctx: Context):
if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True) # if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True)
#if await database.get_arcade(ctx.guild.id): return await ctx.respond(embed=Arcade_Embed.register_already(), ephemeral=True) # #if await database.get_arcade(ctx.guild.id): return await ctx.respond(embed=Arcade_Embed.register_already(), ephemeral=True)
await ctx.respond(embed=Arcade_Embed.register_inital(), view=Arcade_Register_Agree(), ephemeral=True) # await ctx.respond(embed=Arcade_Embed.register_inital(), view=Arcade_Register_Agree(), ephemeral=True)
#
@guild_only() # @guild_only()
@cooldown(1, 10, BucketType.user) # @cooldown(1, 10, BucketType.user)
@ARCADE.command(name="정보", description="눈싸움 정보") # @ARCADE.command(name="정보", description="눈싸움 정보")
async def _정보(self, ctx: Context): # async def _정보(self, ctx: Context):
if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True) # if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True)
if await database.get_arcade(ctx.guild.id): return await ctx.respond(embed=Arcade_Embed.register_already(), ephemeral=True) # if await database.get_arcade(ctx.guild.id): return await ctx.respond(embed=Arcade_Embed.register_already(), ephemeral=True)
pass # pass
#
# @guild_only()
# @cooldown(1, 10, BucketType.user)
# @ARCADE.command(name="돈벌기", description="눈싸움 돈벌기")
# async def _돈벌기(self, ctx: Context):
# pass
#
# @guild_only()
# @cooldown(1, 10, BucketType.user)
# @ARCADE.command(name="레이드", description="눈싸움 레이드")
# async def _레이드(self, ctx: Context):
# pass
#
### @guild_only()
# @cooldown(1, 10, BucketType.user)
# @ARCADE.command(name="연합요청", description="눈싸움 연합요청")
# async def _연합요청(self, ctx: Context, guild: Option(str, "연합할 서버를 입력해주세요!", autocomplete=basic_autocomplete(Guild_Autocomplete))):
# pass
#
def setup(bot): def setup(bot):
bot.add_cog(CArcade(bot)) bot.add_cog(CArcade(bot))

View File

@ -1,10 +1,10 @@
import pendulum import pendulum
from discord import Member, SlashCommandGroup, Option from discord import Member, SlashCommandGroup, Option, Color
from discord.ext.commands import Cog, cooldown, BucketType, command, has_permissions, bot_has_permissions, Context, guild_only, bot_has_guild_permissions, check from discord.ext.commands import Cog, cooldown, BucketType, command, has_permissions, bot_has_permissions, Context, guild_only, bot_has_guild_permissions, check
from Christmas.UI.Modal import Send_Mail_Modal from Christmas.UI.Modal import Send_Mail_Modal
from Christmas.UI.Embed import Mail_Embed from Christmas.UI.Embed import Mail_Embed, ChristmasEmbed
from Christmas.Database import database from Christmas.Database import database
from Christmas.UI.Paginator import Mail_Paginator from Christmas.UI.Paginator import Mail_Paginator
class CMail(Cog): class CMail(Cog):
@ -21,6 +21,7 @@ class CMail(Cog):
if pendulum.now() > christmas: if pendulum.now() > christmas:
await ctx.respond("이미 편지를 보낼수 있는 기간이 지났어요! 받은 편지가 있다면 확인해보세요!", ephemeral=True) await ctx.respond("이미 편지를 보낼수 있는 기간이 지났어요! 받은 편지가 있다면 확인해보세요!", ephemeral=True)
return return
if ctx.author == member: return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="자기 자신에게 편지를 보낼수 없어요!", color=Color.red()),ephemeral=True)
if await database.get_mail_user(member.id, ctx.author.id): if await database.get_mail_user(member.id, ctx.author.id):
if await database.get_instered_mail_edited(member.id, ctx.author.id): if await database.get_instered_mail_edited(member.id, ctx.author.id):
await ctx.respond(embed=Mail_Embed.mail_cant_edit(), ephemeral=True) await ctx.respond(embed=Mail_Embed.mail_cant_edit(), ephemeral=True)

View File

@ -3,6 +3,7 @@ from discord import Member, SlashCommandGroup, Option, AutocompleteContext, Colo
from discord.ext.commands import Cog, cooldown, BucketType, command, has_permissions, bot_has_permissions, Context, guild_only, bot_has_guild_permissions, check from discord.ext.commands import Cog, cooldown, BucketType, command, has_permissions, bot_has_permissions, Context, guild_only, bot_has_guild_permissions, check
import wavelink import wavelink
import random import random
import pendulum
from Christmas.Database import database from Christmas.Database import database
from Christmas.UI.Embed import Music_Embed, ChristmasEmbed from Christmas.UI.Embed import Music_Embed, ChristmasEmbed
from Christmas.config import ChristmasConfig from Christmas.config import ChristmasConfig
@ -19,10 +20,12 @@ class CMusic(Cog):
@guild_only() @guild_only()
async def _play(self, ctx: Context): async def _play(self, ctx: Context):
if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True) if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True)
await ctx.defer(ephemeral=True) await ctx.defer()
get_guild = await database.get_guild(ctx.guild.id) get_guild = await database.get_guild(ctx.guild.id)
if not get_guild["music"] == True: return await ctx.respond(embed=Music_Embed.music_notenable(), ephemeral=True) if not get_guild["music"] == True: return await ctx.respond(embed=Music_Embed.music_notenable())
if ctx.author.voice == None or ctx.author.voice.channel == None: return await ctx.respond(embed=Music_Embed.author_not_voice(), ephemeral=True) if get_guild["admin_run"] == True:
if not ctx.author.guild_permissions.administrator: return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="관리자만 사용할수 있는 명령어에요!", color=Color.red()),ephemeral=True)
if ctx.author.voice == None or ctx.author.voice.channel == None: return await ctx.respond(embed=Music_Embed.author_not_voice())
player = None player = None
node = wavelink.Pool.get_node() node = wavelink.Pool.get_node()
if node.get_player(ctx.guild.id) == None: if node.get_player(ctx.guild.id) == None:
@ -30,7 +33,11 @@ class CMusic(Cog):
else: else:
player = node.get_player(ctx.guild.id) player = node.get_player(ctx.guild.id)
try: try:
query = await wavelink.Playable.search(random.choice(self.config.LOFI()), source=wavelink.TrackSource.YouTube) query = None
if pendulum.now() > pendulum.datetime(2023, 12, 24, 12, 0, 0):
query = await wavelink.Playable.search(self.config.CHRISTMAS, source=wavelink.TrackSource.YouTube)
else:
query = await wavelink.Playable.search(random.choice(self.config.LOFI), source=wavelink.TrackSource.YouTube)
await player.play(query[0]) await player.play(query[0])
await ctx.respond(embed=Music_Embed.music_play()) await ctx.respond(embed=Music_Embed.music_play())
except Exception as e: except Exception as e:
@ -42,17 +49,40 @@ class CMusic(Cog):
@guild_only() @guild_only()
async def _stop(self, ctx: Context): async def _stop(self, ctx: Context):
if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True) if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True)
await ctx.defer(ephemeral=True) await ctx.defer()
get_guild = await database.get_guild(ctx.guild.id) get_guild = await database.get_guild(ctx.guild.id)
if not get_guild["music"] == True: return await ctx.respond(embed=Music_Embed.music_notenable(), ephemeral=True) if not get_guild["music"] == True: return await ctx.respond(embed=Music_Embed.music_notenable())
if ctx.author.voice == None or ctx.author.voice.channel == None: return await ctx.respond(embed=Music_Embed.author_not_voice(), ephemeral=True) if get_guild["admin_run"] == True:
if not ctx.author.guild_permissions.administrator: return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="관리자만 사용할수 있는 명령어에요!", color=Color.red()),ephemeral=True)
if ctx.author.voice == None or ctx.author.voice.channel == None: return await ctx.respond(embed=Music_Embed.author_not_voice())
node = wavelink.Pool.get_node() node = wavelink.Pool.get_node()
player = node.get_player(ctx.guild.id) player = node.get_player(ctx.guild.id)
if player == None: return await ctx.respond(embed=Music_Embed.music_not_playing(), ephemeral=True) if player == None: return await ctx.respond(embed=Music_Embed.music_not_playing(), ephemeral=True)
await player.stop() await player.stop()
await ctx.me.voice.disconnect() # 음악 채널에서 나감
await player.disconnect()
await ctx.respond(embed=Music_Embed.music_stop()) await ctx.respond(embed=Music_Embed.music_stop())
@MUSIC.command(name="설정", description="음악 설정을 변경합니다.")
@cooldown(1, 10, BucketType.user)
@guild_only()
async def _setting(self, ctx: Context, setting: Option(str, name="설정", description="설정할 항목을 선택해주세요!", choices=["음악 활성화", "관리자만 재생 가능"], required=True), value: Option(str, name="", description="설정할 값을 선택해주세요!", choices=["켜기", "끄기"], required=True)):
if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True)
await ctx.defer()
if not ctx.author.guild_permissions.administrator: return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="관리자만 사용할수 있는 명령어에요!", color=Color.red()),ephemeral=True)
if setting == "관리자만 재생 가능":
if value == "켜기":
await database.update_music_setting(ctx.guild.id, True, "admin_run")
await ctx.respond(embed=Music_Embed.music_setting(True, "admin_run"), ephemeral=True)
else:
await database.update_music_setting(ctx.guild.id, False, "admin_run")
await ctx.respond(embed=Music_Embed.music_setting(False, "admin_run"), ephemeral=True)
if setting == "음악 활성화":
if value == "켜기":
await database.update_music_setting(ctx.guild.id, True, "music")
await ctx.respond(embed=Music_Embed.music_setting(True, "music"), ephemeral=True)
else:
await database.update_music_setting(ctx.guild.id, False, "music")
await ctx.respond(embed=Music_Embed.music_setting(False, "music"), ephemeral=True)
def setup(bot): def setup(bot):
bot.add_cog(CMusic(bot)) bot.add_cog(CMusic(bot))

View File

@ -30,5 +30,10 @@ class CUtil(Cog):
data2 = await Get_Backend_latency() data2 = await Get_Backend_latency()
await ctx.respond(embed=Default_Embed.BotInfo(data, bot=self.bot, APIlatency=data2)) await ctx.respond(embed=Default_Embed.BotInfo(data, bot=self.bot, APIlatency=data2))
@cooldown(1, 10, BucketType.user)
@slash_command(name="도움말", description="도움말을 확인합니다.")
async def _help(self, ctx: Context):
await ctx.respond(embed=Default_Embed.help())
def setup(bot): def setup(bot):
bot.add_cog(CUtil(bot)) bot.add_cog(CUtil(bot))

View File

@ -1,10 +1,12 @@
import random import random
import wavelink import wavelink
import pendulum
import onnxruntime as rt import onnxruntime as rt
from discord import ApplicationContext, DiscordException, Game, Guild from discord import ApplicationContext, DiscordException, Game, Guild
from discord.ext.commands import Cog from discord.ext.commands import Cog
from discord.ext import tasks
from discord.ext.commands import CommandOnCooldown from discord.ext.commands import CommandOnCooldown
from Christmas.UI.Embed import Default_Embed from Christmas.UI.Embed import Default_Embed
@ -57,6 +59,6 @@ class Event(Cog):
#@Cog.listener() #@Cog.listener()
#async def on_wavelink_node_ready(self, node: wavelink.Node): #async def on_wavelink_node_ready(self, node: wavelink.Node):
# print(f"Node {node.id} is ready!") # print(f"Node {node.id} is ready!")
def setup(bot): def setup(bot):
bot.add_cog(Event(bot)) bot.add_cog(Event(bot))

View File

@ -19,7 +19,7 @@ class database:
async def register_guild(guild_id: int) -> None: async def register_guild(guild_id: int) -> None:
conn = await MongoDBClient().connect() conn = await MongoDBClient().connect()
await conn.guild.insert_one({"_id": guild_id}) await conn.guild.insert_one({"_id": guild_id, "admin_run": False, "music": True})
async def insert_mail(send_user_id: int, user_id: int, user_name: str, mail_title: str, mail_content: str): async def insert_mail(send_user_id: int, user_id: int, user_name: str, mail_title: str, mail_content: str):
try: try:
@ -81,4 +81,11 @@ class database:
async def get_arcade(guild_id: int): async def get_arcade(guild_id: int):
conn = await MongoDBClient().connect() conn = await MongoDBClient().connect()
return await conn.arcade.find_one({"_id": guild_id}) return await conn.arcade.find_one({"_id": guild_id})
async def update_music_setting(guild_id: int, value: bool, setting: str):
conn = await MongoDBClient().connect()
if setting == "music":
await conn.guild.update_one({"_id": guild_id}, {"$set": {"music": value}})
elif setting == "admin_run":
await conn.guild.update_one({"_id": guild_id}, {"$set": {"admin_run": value}})

View File

@ -0,0 +1,16 @@
from Christmas.SearchEngine import Search
class Snowball:
async def register_guild(guild_id: int, guild_name: str, region: str):
search = Search()
index = await search.connect()
await index.add_documents([{"guild_id": guild_id, "guild_name": guild_name, "region": region}])
async def query_guild(query: str):
search = Search()
index = await search.connect()
result = await index.search(query)
return result

View File

@ -0,0 +1,15 @@
from meilisearch_python_sdk import AsyncClient as Client
from Christmas.config import ChristmasConfig
class Search:
def __init__(self):
self.config = ChristmasConfig()
async def connect(self):
self.client = Client(self.config.SEARCH_ENGINE["HOST"], self.config.SEARCH_ENGINE["KEY"])
self.index = self.client.index(self.config.SEARCH_ENGINE["INDEX"])
return self.index
async def close(self):
await self.client.aclose()

View File

@ -0,0 +1,16 @@
from discord import AutocompleteContext
from Christmas.SearchEngine.Snowball import Snowball
async def Guild_Autocomplete(ctx: AutocompleteContext):
snowball = Snowball()
query = ctx.value
print(query)
result = await snowball.query_guild(query)
results = []
for i in result["hits"]:
gname = i["guild_name"]
gid = i["guild_id"]
results.append(f"{gname} ({gid})")
return results

View File

@ -4,6 +4,7 @@ from discord import Interaction, ButtonStyle, Embed, Color, TextChannel, Forbidd
from Christmas.UI.Embed import Mail_Embed, Arcade_Embed from Christmas.UI.Embed import Mail_Embed, Arcade_Embed
from Christmas.Database import database from Christmas.Database import database
from Christmas.SearchEngine.Snowball import Snowball
class Mail_Confirm_Button(View): class Mail_Confirm_Button(View):
def __init__(self, editmode: bool, recive_user: Member, title: str, description: str, *args, **kwargs): def __init__(self, editmode: bool, recive_user: Member, title: str, description: str, *args, **kwargs):
self.editmode = editmode self.editmode = editmode
@ -39,8 +40,11 @@ class Arcade_Register_Agree(View):
async def agree(self, button, interaction: Interaction): async def agree(self, button, interaction: Interaction):
await interaction.response.defer() await interaction.response.defer()
try: try:
await database.register_arcade(interaction.guild.id, interaction.guild.name, random.choice(["south", "north"])) region = random.choice(["south", "north"])
await database.register_arcade(interaction.guild.id, interaction.guild.name, region)
await Snowball.register_guild(interaction.guild.id, interaction.guild.name, region)
except Exception as e: except Exception as e:
print(e)
await interaction.edit_original_response(embed=Arcade_Embed.register_failed(), view=None) await interaction.edit_original_response(embed=Arcade_Embed.register_failed(), view=None)
return return
await interaction.edit_original_response(embed=Arcade_Embed.register_sucessfull(), view=None) await interaction.edit_original_response(embed=Arcade_Embed.register_sucessfull(), view=None)

View File

@ -68,7 +68,17 @@ class Default_Embed:
def cooldown(sec): def cooldown(sec):
return "이 명령어는 " + str(sec) + "초 뒤에 다시 사용할 수 있어요!" return "이 명령어는 " + str(sec) + "초 뒤에 다시 사용할 수 있어요!"
@staticmethod
def help():
embed = ChristmasEmbed(title="🎉 크돌이 도움말", description="크리스마스를 즐겨보세요!")
embed.add_field(name="``/도움말``", value="크돌이의 도움말을 확인해요!", inline=False)
embed.add_field(name="``/서버가입``", value="이 서버에 크돌이를 가입해요!", inline=False)
embed.add_field(name="``/봇정보``", value="크돌이의 정보를 확인해요!", inline=False)
embed.add_field(name="**편지**", value="``/편지 보내기 (유저)``: 유저에게 편지를 보내요!\n``/편지 확인``: 받은 편지를 확인해요!", inline=False)
embed.add_field(name="**그림**", value="``/그림 생성``: 크돌이가 그림을 그려줘요!\n``/그림 분석``: 그림을 분석해요!", inline=False)
embed.add_field(name="**음악**", value="``/음악 재생``: 크돌이가 음악을(LOFI) 재생해요!\n``/음악 정지``: 크돌이가 음악을 정지해요!\n``음악 설정 (설정이름) (값)``: 음악 설정을 변경해요!", inline=False)
embed.set_footer()
return embed
@staticmethod @staticmethod
def BotInfo(gpuserver: typing.Dict[str, typing.Any], bot, APIlatency) -> Embed: def BotInfo(gpuserver: typing.Dict[str, typing.Any], bot, APIlatency) -> Embed:
@ -79,7 +89,7 @@ class Default_Embed:
gpuserver: [system_memory_usage,cuda_memory_usage,oom_count] gpuserver: [system_memory_usage,cuda_memory_usage,oom_count]
""" """
embed = Embed(title="**봇 정보**", description="크돌이의 정보에요!") embed = Embed(title="**봇 정보**", description="크돌이의 정보에요!")
embed.add_field(name="**봇 개요**", value=f"봇 ID: {bot.user.id}\n봇 버전: 0.0.9\n가동시간: {str(uptime)}", inline=False) embed.add_field(name="**봇 개요**", value=f"봇 ID: {bot.user.id}\n봇 버전: 1.0.0\n가동시간: {str(uptime)}\n개발자: RunaLab(tmddn3070)", inline=False)
orin = psutil.virtual_memory().used orin = psutil.virtual_memory().used
orin = orin / 1024 / 1024 / 1024 orin = orin / 1024 / 1024 / 1024
if gpuserver == None or gpuserver["status"] == "offline": if gpuserver == None or gpuserver["status"] == "offline":
@ -255,6 +265,22 @@ class Music_Embed:
embed.set_footer() embed.set_footer()
return embed return embed
@staticmethod
def music_setting(value: bool, settings: str):
embed = ChristmasEmbed(title="✅ 음악 설정 변경!", description="음악 설정을 변경했어요!")
if settings == "music":
if value == True:
embed.add_field(name="안내", value="이제 이 서버에서 음악을 재생할수 있어요!", inline=False)
else:
embed.add_field(name="안내", value="이제 이 서버에서 음악을 재생할수 없어요!", inline=False)
elif settings == "admin_run":
if value == False:
embed.add_field(name="안내", value="이제 이 서버에서 관리자를 제외한 사람들도 음악을 재생할수 있어요!", inline=False)
else:
embed.add_field(name="안내", value="이제 이 서버에서 관리자를 제외한 사람은 음악을 재생할수 없어요!", inline=False)
embed.set_footer()
return embed
class Arcade_Embed: class Arcade_Embed:
@ -306,3 +332,4 @@ class Arcade_Embed:
embed = ChristmasEmbed(title="🎉 눈싸움 정보!", description=f"{guild.name}서버의 눈싸움 정보에요!") embed = ChristmasEmbed(title="🎉 눈싸움 정보!", description=f"{guild.name}서버의 눈싸움 정보에요!")
embed.add_field(name="진영", value=f"{region}", inline=False) embed.add_field(name="진영", value=f"{region}", inline=False)
embed.add_field(name="상대진영", value=f"{region}", inline=False) embed.add_field(name="상대진영", value=f"{region}", inline=False)

View File

@ -41,9 +41,16 @@ class ChristmasConfig:
def AI(self): def AI(self):
return self.json["AI_GATEWAY"] return self.json["AI_GATEWAY"]
@property
def LOFI(self): def LOFI(self):
return self.json["LOFI"] return self.json["LOFI"]
@property @property
def CHRISTMAS(self): def CHRISTMAS(self):
return self.json["CHRISTMAS"] return self.json["CHRISTMAS"]
@property
def SEARCH_ENGINE(self):
return self.json["SEARCH_ENGINE"]

View File

@ -7,4 +7,4 @@ pendulum
Wavelink Wavelink
onnxruntime onnxruntime
psutil psutil
meilisearch-python-async meilisearch_python_sdk