1/(1+e^(-ax))

ポケモンとかPCとか

リストを埋め込み形式で送信する

Top→Discord Botの作り方 - 1/(1+e^(-ax))
prev→特定のフォルダにあるファイルの一覧を作成する - 1/(1+e^(-ax))
next→Discord Botでファイル構造を送信する - 1/(1+e^(-ax))

bgmの入ったファイル構造や、再生キューの状態を送信するために、リストを簡単に送信する関数を作ります。
リストをそのまま送るのは見づらいため、まずはリストを文字列に変換する関数を作ります。


↓埋め込み(Embed)はこんな感じのやつです。↓
f:id:Sigmoid_poke:20210308154949p:plain

基本的には要素ごとに改行で区切りますが、リストの中にリストがある場合は複数の区切り文字を設定するようにします。

送信:[A, [B, C], [D, E], F]
区切り文字['\n', '、']
※'\n'は改行の意


ーーーーーーーーー
A
B、C
D、E
F
ーーーーーーーーー


再帰関数で作ります。fを今回作成する関数として、
先ほどの例だと

f([A, [B, C], [D, E], F]), 区切り文字='\n'
ーーーーーーーーーーーーーーーーーー
f('A')+f( [B, C] )+f( [D, E] ) + f('F')
ーーーーーーーーーーーーーーーーーー
A
f('B') + f('C')
f('D') + f('E')
F
区切り文字='、'
ーーーーーーーーーーーーーーーーーー
A
B、C
D、E
F
ーーーーーーーーーーーーーーーーーー
のような流れとします。

#多重リストを区切り文字で展開する
def list2str(list_, delimiter):
    result = ''
    #区切り文字が存在しなければスペースを区切り文字とする
    if (len(delimiter) == 0):
        d = ' ' #区切り文字
        for s in list_:
            result += str(s) + d
        return result[:-1]
    
    #区切り文字=delimiterの第一要素
    d = delimiter[0]
    for s in list_:
        #list_の中にリストがあれば再帰呼び出し
        if (type(s) is list):
            result += list2str(s, delimiter[1:]) + d
        else:
            result += str(s) + d
    return result[:-1*len(d)]

埋め込みを使ったリストの送信は次のようになります。
Embedには文字数制限があるので、文字数がオーバーした際に文字数過多のメッセージを送るか、送るメッセージを減らすかを引数halfとsenderrで設定しています。

async def send_list(send_method, mention, mes, title = 'Result', delimiter = ['\n'], isembed = True, senderr = True, half = False, ishalf = False):
    if (len(mes) == 0): #listの長さ=0
        await send_method(f'{mention} 該当するデータがありません')

    else:
        #listを文字列に変換
        reply = list2str(mes, delimiter)
        if (ishalf):
            reply += "\n………"
        if (isembed):
            try:
                embed = discord.Embed(title=title, description=reply)
                await send_method(f'{mention} ', embed=embed)
            except:
                if (half and len(mes) > 1):
                    result = await send_list(send_method, mention, mes[:int(len(mes)/2)], title, delimiter, isembed, senderr, half, ishalf = True)
                    return result
                if (senderr):
                    await send_method(f'{mention} エラー:該当するデータが多すぎます')
                    return False
        else:
            await send_method(f'{mention} \n'+reply)
    return True


戻り値は、正しく送信できればTrueであり、senderr=Trueのときに文字数オーバーだった場合はFalseが返ります。

試しに、適当なコマンドを作成して

await send_list(ctx.send, ctx.author.mention, ['A',['B','C'],['D','E'],'F'], delimiter = ['\n',','])

という処理を行ってみると、先ほど例で上げたような埋め込みが送信されると思います。


次回は、音楽ファイルが入っているファイル構造の送信を行ってみたいと思います。
お疲れ様でした。

next→Discord Botでファイル構造を送信する - 1/(1+e^(-ax))