忍者ブログ

ひつ(じのひよこが)プログラミングします。
お仕事や趣味で困ったこととか、何度も「あれ?どうだったかしら」と調べたりしたこととか、作ったものとか、こどものこととかを書きます
★前は週末定期更新でしたが今は不定期更新です

2024/05    04« 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  »06

Discord bot を .bat ファイルとして書こうとしたが挫折した

「Discord の bot を衝動的に作り始めるにはプログラミング環境を整えるのが少し大変なのでは?」からの「Windows 標準機能だけでできればいいじゃん!」がきっかけだった。なお、Mac とか Linux とか使っているユーザは自前でより良い方法を使えるだろう、と考えているので知らないのである。


結論として挫折した。以下のようなものを書いてみたが、これ以上は無理。しかも結局 jq を入れた。jq コマンドはhttps://stedolan.github.io/jq/から入手。

@echo off
setlocal enabledelayedexpansion

set botCommand=ボットのコマンド名
set botLength=6
set token=Tokenの情報
set channel=チャンネルのID

curl -X GET -H "Authorization:Bot %token%" https://discordapp.com/api/channels/%channel%/messages > tmp_log
for /l %%n in (0,0,0) do (
  type tmp_log | jq .[0].id > tmp_lastId
  for /f %%a in (tmp_lastId) do (
    if "%%a" neq "null" (
      set messageId=%%a
      set messageId=!messageId:"=!
      set url=https://discordapp.com/api/channels/%channel%/messages?after=!messageId!
      call echo !url! > url
    ) else (
      echo skipped
    )

    for /f "usebackq" %%a in (`findstr %botCommand% tmp_log`) do (
      echo %%a%
      if "%%a"=="" (
        echo not found
      ) else (
        set /a dice=!random!*%botLength%/32767
        echo !dice!
        if "!dice!"=="0" (
          curl -X POST -H "Content-Type:application/json" -H "Authorization:Bot %token%" -d "{\"content\": \"0だったよ\"}"  https://discordapp.com/api/channels/%channel%/messages
        )
        if "!dice!"=="1" (
          curl -X POST -H "Content-Type:application/json" -H "Authorization:Bot %token%" -d "{\"content\": \"1だったよ\"}"  https://discordapp.com/api/channels/%channel%/messages
        )
        if "!dice!"=="2" (
          curl -X POST -H "Content-Type:application/json" -H "Authorization:Bot %token%" -d "{\"content\": \"2だったよ\"}"  https://discordapp.com/api/channels/%channel%/messages
        )
        if "!dice!"=="3" (
          curl -X POST -H "Content-Type:application/json" -H "Authorization:Bot %token%" -d "{\"content\": \"3だったよ\"}"  https://discordapp.com/api/channels/%channel%/messages
        )
        if "!dice!"=="4" (
          curl -X POST -H "Content-Type:application/json" -H "Authorization:Bot %token%" -d "{\"content\": \"4だったよ\"}"  https://discordapp.com/api/channels/%channel%/messages
        )
        if "!dice!"=="5" (
          curl -X POST -H "Content-Type:application/json" -H "Authorization:Bot %token%" -d "{\"content\": \"5だったよ\"}"  https://discordapp.com/api/channels/%channel%/messages
        )
      )
    )
    for /f %%b in (url) do (
      timeout /t 10 /nobreak > nul
      curl -X GET -H "Authorization:Bot %token%" %%b% > tmp_log
    )
  )
)

問題点は以下の3つ。

  • for とか if とか多用するのに、その度に問題になる遅延変数が無理。
    遅延変数で悩むくらいだったらファイルに書き出してそれを使うのが良いかも
  • 力業であっても json のパースが難しい。
    tr コマンドも cut コマンドも使えないし grep なんてもってのほかである
    findstr 使いにくい。
  • 「この文字コードで保存して」とかそのあたりを細かく要求をしなければならない時点で「Discord の bot を衝動的に作り始める人」に共有するには無理

遅延変数がもうちょっとわかりやすくなり、for や if が使いやすくなり、json を強引にでもパースできるようになればもうちょっとやれるかもしれないけど……

半年ほど前の Windows 10 の更新で curl コマンドや ssh コマンドなどがコマンドプロンプトからも使えるようになったので「やれるかも」と思ったのだがまだちょっと早かった。

PR

コメント

ただいまコメントを受けつけておりません。

ブログ内検索

P R