async def on_command_error(self, ctx, error): if isinstance(error, commands.CheckFailure): return if isinstance(error, commands.errors.CommandNotFound): return if isinstance(error, commands.CommandOnCooldown): embed = discord.Embed( title="⚠ 쿨타임 중!", description="{}초 뒤에 재시도하세요.".format(int(error.retry_after)), color=0xD8EF56, ) return await ctx.send(embed=embed) if isinstance(error, commands.CommandInvokeError): original = error.original if isinstance(original, discord.Forbidden): embed = Embed.warn( "주의", "봇의 권한이 부족하여 {} 명령어를 수행할 수 없어요.".format(ctx.command.name), ) return await ctx.send(embed=embed) if ( isinstance(error, commands.BadArgument) or isinstance(error, commands.BadUnionArgument) or isinstance(error, commands.MissingRequiredArgument) ): name = str(ctx.command) try: embed = Embed.warn( "주의", "잘못된 형식으로 명령어를 사용했어요. \n올바른 사용 : `봇 {} {}`".format( name, self.argument_data[name] ), ) return await ctx.send(embed=embed) except KeyError: embed = Embed.warn("주의", "잘못된 형식으로 명령어를 사용했어요.") return await ctx.send(embed=embed) embed = Embed.error( "이런!", "{} 명령어 수행 중 핸들링 되지 않은 오류가 발생했어요!\n```{}```\n지속적인 문제 발생 시 `봇 문의` 명령어로 문의해주세요.".format( ctx.command.name, error ), ) await ctx.send(embed=embed) print( "Ignoring exception in command {}".format(ctx.command), file=sys.stderr, ) traceback.print_exception( type(error), error, error.__traceback__, file=sys.stderr ) self.logger.warning( "Error {} occured in command {}".format( type(error), ctx.command.name ) )
async def fine_dust(self, ctx, *, args=None): params = { "serviceKey": CONFIG.MISAE, "numOfRows": 1, "pageSize": 1, "pageNo": 1, "startPage": 1, "itemCode": "PM10", "dataGubun": "HOUR", } misae_c = await HTTP.get( url= "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getCtprvnMesureLIst", params=params, ) soup = BeautifulSoup(misae_c, "lxml-xml") misae_sido = self._handle_pm(soup) params["itemCode"] = "PM25" chomisae_c = await HTTP.get( url= "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getCtprvnMesureLIst", params=params, ) soup = BeautifulSoup(chomisae_c, "lxml-xml") chomisae_sido = self._handle_pm(soup) embed = discord.Embed( title="💨 미세먼지", desciption="<미세먼지>\n<초미세먼지> 로 알려드려요.", color=0x1DC73A, ) embed.set_footer(text=f"에어코리아 | {misae_sido['date']}") if args is None: for i in misae_sido["sido"].keys(): embed.add_field( name=i, value= f"{misae_sido['sido'][i]}㎍/m³ | {self._checkpm10(misae_sido['sido'][i])}\n{chomisae_sido['sido'][i]}㎍/m³ | {self._checkpm25(chomisae_sido['sido'][i])}", inline=True, ) await ctx.send(embed=embed) else: if args in misae_sido["sido"].keys(): embed.add_field( name=args, value= f"{misae_sido['sido'][args]}㎍/m³ | {self._checkpm10(misae_sido['sido'][args])}\n{chomisae_sido['sido'][args]}㎍/m³ | {self._checkpm25(chomisae_sido['sido'][args])}", inline=True, ) await ctx.send(embed=embed) else: embed = Embed.warn( title="주의", description= "선택하신 지역 이름을 찾을 수 없어요.\n`봇 미세먼지` 로 전체 지역을 볼 수 있어요.", ) await ctx.send(embed=embed)
async def join(self, ctx): if not ctx.message.author.voice: embed = Embed.warn(title="먼저 음성 채널에 들어와주세요!") return await ctx.send(embed=embed) await self.bot.Wonstein.connect(ctx.message.author.voice.channel) embed = Embed.default( title=f"성공적으로 {ctx.message.author.voice.channel}에 연결했습니다.") await ctx.send(embed=embed)
async def cog_check(self, ctx): if ctx.guild is None: return None if ctx.author.guild_permissions.administrator: return True else: embed = Embed.warn("주의", "이 명령어는 서버에 **관리자 권한**이 있어야 사용할 수 있어요!") await ctx.send(embed=embed)
async def delete_message(self, ctx, amount: typing.Union[int]): if amount > 0 and amount <= 100: deleted_message = await ctx.channel.purge(limit=amount) embed = Embed.check( title="메시지 삭제", description="%s개의 메시지를 지웠어요." % len(deleted_message), ) await ctx.send(embed=embed, delete_after=3) else: embed = Embed.warn(title="오류 발생", description="지우는 메시지의 개수는 1개~100개여야 해요.") await ctx.send(embed=embed, delete_after=3)
async def user_info(self, ctx, *, user: Union[discord.Member, int, str] = None): try: if user is None: user = ctx.author elif isinstance(user, int): user = ctx.guild.get_member(user) elif isinstance(user, str): user = ctx.guild.get_member_named(user) if user is None: raise commands.BadArgument() now = datetime.datetime.now() created_at = user.created_at + datetime.timedelta(hours=9) dap_created = now - created_at created_at = created_at.strftime("%Y-%m-%d %H:%M:%S") joined_at = user.joined_at + datetime.timedelta(hours=9) dap_joined = now - joined_at joined_at = joined_at.strftime("%Y-%m-%d %H:%M:%S") avatar_url = user.avatar_url embed = discord.Embed( title="👥 유저 정보", description="선택하신 유저에 대한 정보를 불러왔어요. ", color=0x1DC73A, ) embed.add_field(name="이름", value=user.name, inline=False) embed.add_field(name="유저 ID", value=user.id, inline=False) embed.add_field( name="계정 생성일", value=f"{created_at}\n({dap_created.days}일 전)", inline=True, ) embed.add_field( name="서버 가입일", value=f"{joined_at}\n({dap_joined.days}일 전)", inline=True, ) embed.set_thumbnail(url=avatar_url) await ctx.send(embed=embed) except: embed = Embed.warn( "주의", "`봇 유저정보 (멘션 or ID or 이름)` 으로 사용해주세요.\n유저를 불러오지 못했어요.", ) embed.set_footer(text="이 서버에 있는 유저가 아니면 검색이 불가해요.") await ctx.send(embed=embed)
async def set_slowmode(self, ctx, seconds: typing.Union[int]): if seconds > 0 and seconds < 21601: await ctx.channel.edit(slowmode_delay=seconds) embed = discord.Embed( title="🐌 슬로우모드", description="{}의 슬로우모드를 {}초로 설정했어요.".format( ctx.channel.mention, seconds), color=0x1DC73A, ) embed.set_footer(text="슬로우모드 해제는 `봇 슬로우해제`를 사용하세요.") await ctx.send(embed=embed) else: embed = Embed.warn("주의", "슬로우모드는 1~21600초 사이로만 설정할 수 있어요.") await ctx.send(embed=embed)
async def play(self, ctx, *, query: str): Audio = self.bot.Wonstein.getVC(ctx.guild.id) await Audio.setAutoplay(False) if not Audio: embed = Embed.warn(title="먼저 `!join`을 입력해주세요.") return await ctx.send(embed=embed) Data = await Audio.loadSource(query) if isinstance(Data, list): Data = Data[0] Source, Index = Data["data"], Data["index"] + 1 self.logger.info(Source) if Index == 1: await ctx.send(f'> 🎵 {Source["title"]}이 곧 재생되어요!') else: await ctx.send(f'> 🎵 {Source["title"]}이 대기열 **{Index}**번에 추가되었어요!' )
async def on_command_error(self, ctx, error): if isinstance(error, commands.CheckFailure): return elif isinstance(error, commands.CommandNotFound): return elif isinstance(error, commands.CommandOnCooldown): embed = Embed.warn( title="⚠ 쿨타임 중!", description=f"{int(error.retry_after)}초 뒤에 재시도하세요.", ) await ctx.send(embed=embed) embed = Embed.error( "이런!", "{} 명령어 수행 중 핸들링 되지 않은 오류가 발생했어요!\n```{}```\n지속적인 문제 발생 시 `봇 문의` 명령어로 문의해주세요." .format(ctx.command.name, error), ) await ctx.send(embed=embed)
async def repeat(self, ctx, *, args): if args == "": embed = Embed.warn( title="주의", description="봇 따라해 `할말`로 입력해주세요!\n아무 값도 받지 못했어요.", ) await ctx.channel.send(embed=embed) return if "@everyone" in args or "@here" in args: embed = Embed.error( title="경고", description= "`@everyone`이나 `@here`은 다른 사용자에게 피해를 줄 수 있어요.\n사용을 제한할께요!", ) embed.set_footer(text=ctx.author, icon_url=ctx.author.avatar_url) await ctx.channel.send(embed=embed) else: try: await ctx.delete() except: pass await ctx.channel.send(args)
async def profile_emoji(self, ctx, *, args): try: memberid = args.lstrip() memberid = memberid.replace("<@", "") memberid = memberid.replace("!", "") memberid = memberid.replace(">", "") if memberid == "": memberid = ctx.author.id member = self.bot.get_user(memberid) a = member.avatar_url if a == "": a = member.default_avatar_url embed = discord.Embed(title="🖼️ 프로필 사진", description="", color=0x62BF42) embed.set_image(url=a) await ctx.send(embed=embed) else: memberid = int(memberid) member = self.bot.get_user(memberid) a = member.avatar_url if a == "": a = member.default_avatar_url embed = discord.Embed(title="🖼️ 프로필 사진", description="", color=0x62BF42) embed.set_image(url=a) await ctx.send(embed=embed) except: embed = Embed.warn("주의", "`봇 프사 <멘션 or ID>` 로 사용해주세요. 유저를 불러오지 못했어요.") await ctx.send(embed=embed)
async def is_gaming(self, ctx): if ctx.author.id in self.gaming_list: embed = Embed.warn("주의", "게임을 진행중이셔서 해당 명령어를 실행할 수 없어요.") await ctx.send(embed=embed) return True
async def user_info(self, ctx, *, args): try: a = args.lstrip() if a == "": a = ctx.author.id try: a = a.replace("<", "") a = a.replace("@", "") a = a.replace("!", "") a = a.replace(">", "") a = int(a) except: pass date = "%s (UTC)" % ctx.guild.get_member(a).created_at try: game = ctx.guild.get_member(a).activity if game.type == discord.ActivityType.listening: game = game.title + " - " + ", ".join(game.artists) else: game = game.name except: game = "플레이 중인 게임이 없습니다." if game is None: game = "플레이 중인 게임이 없습니다." member = ctx.guild.get_member(a) status = ctx.guild.get_member(a).status joined = str(ctx.guild.get_member(a).joined_at) if status == discord.Status.online: status = "온라인" elif status == discord.Status.idle: status = "자리비움" elif status == discord.Status.dnd: status = "다른 용무 중" elif status == discord.Status.offline: status = "오프라인" else: status = "알 수 없음." asdf = member.avatar_url if asdf == "": asdf = member.default_avatar_url embed = discord.Embed( title="ℹ️ 유저 정보", description="선택하신 유저에 대한 정보를 불러왔습니다.\n\n", color=0x1DC73A, ) embed.add_field(name="이름", value=ctx.guild.get_member(a).name, inline=False) embed.add_field(name="유저 ID", value=ctx.guild.get_member(a).id, inline=True) embed.add_field(name="계정 생성일", value=date, inline=True) embed.add_field(name="서버 가입일", value=joined + " (UTC)", inline=False) embed.add_field(name="플레이 중", value=game, inline=True) embed.add_field(name="상태", value=status, inline=False) insignia = await self.get_insignia(a) embed.set_thumbnail(url=asdf) await ctx.send(embed=embed) if insignia is not None: embed1 = discord.Embed(title=" ") embed1.set_thumbnail(url=insignia) await ctx.send(embed=embed1) # <:mut:664836978520621076> except: embed = Embed.warn("주의", "`봇 유저정보 <멘션 or ID>` 로 사용해주세요. 유저를 불러오지 못했어요.") embed.set_footer(text="이 서버에 있는 유저가 아니면 불러올 수 없어요!") await ctx.send(embed=embed)
async def cog_check(self, ctx): if ctx.author.id in self.owner_list: return True else: embed = Embed.warn("주의", "이 명령어는 봇 오너만 사용이 가능해요.") await ctx.send(embed=embed)