async def pitch(ctx, arg1='emp'): guild_id = ctx.guild.id str_id = str(guild_id) # プレフィックスを取得 guild_deta = ctrl_db.get_guild(str_id) if isinstance(guild_deta, type(None)): prefix = '?' else: prefix = guild_deta.prefix struid = str(ctx.author.id) if arg1 == 'emp': await ctx.send('引数が不足してるで。{}helpを見てみ。'.format(prefix)) return try: pitch = float(arg1) except: await ctx.send('使い方が正しくないで。{}helpを見てみ。'.format(prefix)) return if pitch >= 0.0 and pitch <= 2.0: ctrl_db.set_readpitch(pitch, struid) u_st = ctrl_db.get_user(str(ctx.author.id)) spk = spk_to_char(u_st.speaker) await ctx.send('{}のステータス 話者:{} 高さ:{} 速度:{} 抑揚:{}'.format( ctx.author.mention, spk, u_st.pitch, u_st.speed, u_st.r_range)) else: await ctx.send('数値が正しくないで。0.0~2.0を指定してくれな。デフォルトは1.2や。')
async def spk(ctx, arg1='emp'): global channel cand = arg1 guild_id = ctx.guild.id str_id = str(guild_id) guild_deta = ctrl_db.get_guild(str_id) if isinstance(guild_deta, type(None)): prefix = '?' else: prefix = guild_deta.prefix if cand == 'emp': await ctx.send('引数が不足してるで。{}spk helpを見てみ。'.format(prefix)) return if cand == 'help': embed = discord.Embed(title='{}spk'.format(prefix), description='声を変えるコマンド') embed.add_field(name='{}spk yukari'.format(prefix), value='ゆかりさんに変身', inline=False) embed.add_field(name='{}spk maki'.format(prefix), value='マキマキに変身', inline=False) embed.add_field(name='{}spk ai'.format(prefix), value='アイちゃんに変身', inline=False) embed.add_field(name='{}spk kou'.format(prefix), value='コウ先生に変身', inline=False) await ctx.send(embed=embed) else: # 呼び出したチャンネルでコマンドが叩かれた場合 if ctx.channel == channel.get(guild_id): if cand not in sps: # 引き数のキャラが存在しない場合 await ctx.channel.send('おっと、そのキャラは未実装だ。すまねえ。') return else: cand = char_to_spk(cand) # 話者を設定 ctrl_db.set_user(str(ctx.author.id), cand) u_st = ctrl_db.get_user(str(ctx.author.id)) spk = spk_to_char(u_st.speaker) await ctx.send('{}のステータス 話者:{} 高さ:{} 速度:{} 抑揚:{}'.format( ctx.author.mention, spk, u_st.pitch, u_st.speed, u_st.r_range))
async def on_message(message): print(message) # if message.author.bot: # return global voice global channel mess_id = message.author.id # メッセージを送った人のユーザID # ギルドIDがない場合、DMと判断する if isinstance(message.guild, type(None)): # 管理人からのDMだった場合 if message.author.id == manager: #コマンド操作になっているか if message.content.startswith('?'): await message.channel.send('コマンドを受け付けたで') await bot.process_commands(message) # メッセージをコマンド扱いにする return else: await message.channel.send('コマンド操作をしてくれ') return else: await message.channel.send( '喋太郎に何かあれば、だーやまんのお題箱( https://odaibako.net/u/gamerkohei )までお願いします。' ) return guild_id = message.guild.id # サーバID # ユーザ情報(speaker)を取得 user = ctrl_db.get_user(str(mess_id)) if isinstance(user, type(None)): # ユーザ情報がなければ、dbへ登録。話者はあおい。 ctrl_db.add_user(str(mess_id), message.author.name, "1") user = ctrl_db.get_user(str(mess_id)) # サーバのプレフィックスを取得 guild_deta = ctrl_db.get_guild(str(guild_id)) if isinstance(guild_deta, type(None)): prefix = '?' else: prefix = guild_deta.prefix # コマンドだった場合 if message.content.startswith(prefix): # prefixは?へ変換する message.content = message.content.replace(prefix, '?', 1) await bot.process_commands(message) # メッセージをコマンド扱いにする return # 召喚されていなかった場合 if guild_id not in channel: return str_guild_id = str(guild_id) # メッセージを、呼び出されたチャンネルで受信した場合 if message.channel.id == channel[guild_id]: # URLを、"URL"へ置換 get_msg = re.sub(r'http(s)?://([\w-]+\.)+[\w-]+(/[-\w ./?%&=]*)?', 'URL', message.content) # reactionの置換 get_msg = get_msg.replace('<:', '') get_msg = re.sub(r':[0-9]*>', '', get_msg) # mention と channel_mentionを名前へ置換 mn_list = message.raw_mentions ch_list = message.raw_channel_mentions # IDに対応する名前の辞書を作成 mn_dict = {} ch_dict = {} # mentionの、ユーザネームへの置換 for ment in mn_list: # 自身へのメンションかどうかで、Keyを変える if ment == mess_id: mn_dict['<@!{}>'.format( str(ment))] = message.guild.get_member(ment).name else: mn_dict['<@{}>'.format( str(ment))] = message.guild.get_member(ment).name # channel_mentionの、チャンネル名への置換 for cnls in ch_list: ch_dict['<#{}>'.format( str(cnls))] = message.guild.get_channel(cnls).name # 変換テーブルの作成 for me_key in mn_dict.keys(): get_msg = get_msg.replace(me_key, mn_dict[me_key], 1) for ch_key in ch_dict.keys(): get_msg = get_msg.replace(ch_key, ch_dict[ch_key], 1) # 読み上げモード確認 is_nameread = ctrl_db.get_guild(str_guild_id).is_nameread # モードによって名前を追加するか検討 if is_nameread == True: get_msg = '{}、'.format(message.author.display_name) + get_msg # 置換文字のリストを取得 words = ctrl_db.get_dict(str_guild_id) for word in words: get_msg = get_msg.replace(word.word, word.read) get_msg = get_msg.replace('<', '').replace('>', '') # print(get_msg) #リクエスト回数のカウント ctrl_db.set_reqcount(datetime.date.today(), datetime.datetime.now().hour) # メッセージを、音声ファイルを作成するモジュールへ投げる処理 try: rawfile = await knockApi(get_msg, user.speaker, user.speed, user.r_range, user.pitch, str_guild_id) # 失敗した場合(ログは吐くようにしたい) except Exception as e: await message.channel.send( 'ちょいとエラー起きたみたいや。少し待ってからメッセージ送ってくれな。\n{}'.format(e)) return # 音声ファイルを再生中の場合再生終了まで止まる while (voice[guild_id].is_playing()): # 他の処理をさせて1秒待機 await asyncio.sleep(1) # 再生処理 voice_mess = './cache/{}/{}'.format(str_guild_id, rawfile) # rawファイルのディレクトリ voice[guild_id].play( discord.FFmpegPCMAudio(voice_mess)) # エンコードして音声チャンネルで再生 while (voice[guild_id].is_playing()): # 他の処理をさせて1秒待機 await asyncio.sleep(1) os.remove(voice_mess) #rawファイルの削除
async def on_message(message): # botは読み上げない if message.author.bot: return global channel mess_id = message.author.id # メッセージを送った人のユーザID # ギルドIDがない場合、DMと判断する if message.guild is None: # 管理人からのDMだった場合 if message.author.id == manager: #コマンド操作になっているか if message.content.startswith('?'): await message.channel.send('コマンドを受け付けたで') await bot.process_commands(message) # メッセージをコマンド扱いにする return else: await message.channel.send('コマンド操作をしてくれ') return else: await message.channel.send( '喋太郎に何かあれば、だーやまん( https://twitter.com/gamerkohei )までリプライかDMをお願いします。' ) return guild_id = message.guild.id # サーバID # ユーザ情報(speaker)を取得 user = ctrl_db.get_user(str(mess_id)) if user is None: # ユーザ情報がなければ、dbへ登録。話者はsumire ctrl_db.add_user(str(mess_id), message.author.name, 'sumire') user = ctrl_db.get_user(str(mess_id)) # サーバのプレフィックスを取得 guild_deta = ctrl_db.get_guild(str(guild_id)) if guild_deta is None: prefix = '?' else: prefix = guild_deta.prefix # コマンドだった場合 if message.content.startswith(prefix): # prefixは?へ変換する message.content = message.content.replace(prefix, '?', 1) await bot.process_commands(message) # メッセージをコマンド扱いにする return # 召喚されていなかった場合 ## VCに接続されているか判断 for vc in bot.voice_clients: if vc.guild.id == guild_id: ctrlvc = vc break try: ctrlvc except UnboundLocalError: return str_guild_id = str(guild_id) # メッセージを、呼び出されたチャンネルで受信した場合 if message.channel == channel.get(guild_id): # this is easteregg01 if message.content == 'はつざつ「屈辱だ…。」': path = 'images/kutsujoku.jpg' if os.path.isfile(path): with open(path, mode='rb') as f: htzt_f = discord.File(f) await message.channel.send(file=htzt_f) return # this is easteregg03 if message.content == 'ゆるしてにゃん': path = 'images/yurushite{}.jpg'.format(random.randint(1, 9)) if os.path.isfile(path): yurusite_f = open(path, mode='rb') yurushite = discord.File(yurusite_f) # URLを、"URL"へ置換 get_msg = re.sub(r'http(s)?://([\w-]+\.)+[\w-]+(/[-\w ./?%&=]*)?', 'URL', message.content) # reactionの置換 get_msg = get_msg.replace('<:', '') get_msg = re.sub(r':[0-9]*>', '', get_msg) # mention と channel_mentionを名前へ置換 mn_list = message.raw_mentions ch_list = message.raw_channel_mentions # IDに対応する名前の辞書を作成 mn_dict = {} ch_dict = {} # mentionの、ユーザネームへの置換 for ment in mn_list: # 自身へのメンションかどうかで、Keyを変える if ment == mess_id: mn_dict['<@!{}>'.format( str(ment))] = message.guild.get_member(ment).name else: mn_dict['<@{}>'.format( str(ment))] = message.guild.get_member(ment).name # channel_mentionの、チャンネル名への置換 for cnls in ch_list: ch_dict['<#{}>'.format( str(cnls))] = message.guild.get_channel(cnls).name # 変換テーブルの作成 for me_key in mn_dict.keys(): get_msg = get_msg.replace(me_key, mn_dict[me_key], 1) for ch_key in ch_dict.keys(): get_msg = get_msg.replace(ch_key, ch_dict[ch_key], 1) # 置換文字のリストを取得 words = ctrl_db.get_dict(str_guild_id) for word in words: get_msg = get_msg.replace(word.word, word.read) get_msg = get_msg.replace('<', '').replace('>', '') # 読み上げモード確認 is_nameread = ctrl_db.get_guild(str_guild_id).is_nameread # モードによって名前を追加するか検討 if is_nameread == True: get_msg = '{}、'.format(message.author.display_name) + get_msg #リクエスト回数のカウント ctrl_db.set_reqcount(datetime.date.today(), datetime.datetime.now().hour) # メッセージを、音声ファイルを作成するモジュールへ投げる処理 try: rawfile = await knockApi(get_msg, user.speaker, user.speed, user.r_range, user.pitch, str_guild_id) # 失敗した場合(ログは吐くようにしたい) except: await message.channel.send( 'To {} ちょいとエラー起きたみたいや。少し待ってからメッセージ送ってくれな。'.format( message.author.name)) try: yurushite_f.close() except NameError: pass return # 音声ファイルを再生中の場合再生終了まで止まる while (ctrlvc.is_playing()): # 他の処理をさせて1秒待機 await asyncio.sleep(1) # 再生処理 voice_mess = './cache/{}/{}'.format(str_guild_id, rawfile) # rawファイルのディレクトリ ctrlvc.play( discord.FFmpegPCMAudio( voice_mess, before_options='-f s16be -ar 16k -ac 1')) # エンコードして音声チャンネルで再生 try: await message.channel.send(file=yurushite) yurusite_f.close() except NameError: pass await asyncio.sleep(0.5) os.remove(voice_mess) #rawファイルの削除
async def status(ctx): u_st = ctrl_db.get_user(str(ctx.author.id)) spk = spk_to_char(u_st.speaker) await ctx.send('{}のステータス 話者:{} 高さ:{} 速度:{} 抑揚:{}'.format( ctx.author.mention, spk, u_st.pitch, u_st.speed, u_st.r_range))