コード例 #1
0
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や。')
コード例 #2
0
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))
コード例 #3
0
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ファイルの削除
コード例 #4
0
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ファイルの削除
コード例 #5
0
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))