前提・実現したいこと
こちらのページで紹介されている読み上げBotを使わせていただこうと思いたち制作に取り掛かったのですが、RubyもDockerも触ったことすらない門外漢の為行き詰ってしまいました。
現状!connectでBotをボイスチャンネルに召喚は出来るのですが、どうにもその段階でエラーを起こし固まってしまうようです。
かなり色々調べたのですが限界を迎えたためどうかお力添えいただければありがたいです。
下にはエラーログと参照サイトのファイルの中からこちら側で編集するファイルのみピックアップしました。
各アプリのバージョン等も下にまとめておきます。
Dockerのログに表示されるエラーメッセージ
[INFO : websocket @ 2021-06-11 02:42:42.661] Discord using gateway protocol version: 6, requested: 6 #<Thread:0x000055a3f37ba1c8@/app/vendor/bundle/ruby/2.5.0/gems/discordrb-3.3.0/lib/discordrb/voice/network.rb:252 run> terminated with exception (report_on_exception is true): Traceback (most recent call last): 8: from /app/vendor/bundle/ruby/2.5.0/gems/discordrb-3.3.0/lib/discordrb/voice/network.rb:254:in `block in connect' 7: from /app/vendor/bundle/ruby/2.5.0/gems/discordrb-3.3.0/lib/discordrb/voice/network.rb:302:in `init_ws' 6: from /app/vendor/bundle/ruby/2.5.0/gems/discordrb-3.3.0/lib/discordrb/voice/network.rb:302:in `new' 5: from /app/vendor/bundle/ruby/2.5.0/gems/discordrb-3.3.0/lib/discordrb/websocket.rb:41:in `initialize' 4: from /app/vendor/bundle/ruby/2.5.0/gems/websocket-client-simple-0.3.0/lib/websocket-client-simple/client.rb:8:in `connect' 3: from /app/vendor/bundle/ruby/2.5.0/gems/websocket-client-simple-0.3.0/lib/websocket-client-simple/client.rb:19:in `connect' 2: from /usr/local/lib/ruby/2.5.0/uri/common.rb:237:in `parse' 1: from /usr/local/lib/ruby/2.5.0/uri/rfc3986_parser.rb:73:in `parse' /usr/local/lib/ruby/2.5.0/uri/rfc3986_parser.rb:67:in `split': bad URI(is not URI?): wss://japan286.discord.media:443:443 (URI::InvalidURIError) [WARN : heartbeat @ 2021-06-11 02:44:04.876] Last heartbeat was not acked, so this is a zombie connection! Reconnecting [ERROR : heartbeat @ 2021-06-11 02:44:04.876] The websocket connection has closed: nil
※追記 変更後のエラーメッセージ
[INFO : websocket @ 2021-06-11 10:02:02.356] Discord using gateway protocol version: 6, requested: 6 [WARN : heartbeat @ 2021-06-11 10:03:24.500] Last heartbeat was not acked, so this is a zombie connection! Reconnecting [ERROR : heartbeat @ 2021-06-11 10:03:24.500] The websocket connection has closed: nil [WARN : vws-i @ 2021-06-11 10:03:25.786] VWS close: no address for japan9411.discord.media:443 [ERROR : vws-i @ 2021-06-11 10:04:43.416] VWS error: Disconnected.
docker-compose.yml
AWSのシークレットキーとBotのトークンは伏せてあります。””で囲わなきゃいけない等初歩の知識不足の可能性もあるため先頭と後ろの文字だけ残しています。
version: '3' services: discord-ttsbot: build: . tty: true volumes: - "./data:/data" environment: - AWS_REGION=ap-northeast-1 - AWS_ACCESS_KEY_ID=AKIA3DEJUM6CADMPZB7G - AWS_SECRET_ACCESS_KEY=l??????????????????????????????F - DISCORD_BOT_TOKEN=Q??????????????????????????????????????????????P - POLLY_VOICE_ID=Mizuki - TTS_CHANNELS=#webhooktest
各ツールのバージョン
ruby 2.7.3p183 [x64-mingw32]
discordrb 3.3.0
Docker 20.10.7
git 2.32.0.windows.1
aws-sdk サイトのGemfileをそのままbundle install したので多分 3.0.1
試したこと
githubのdiscordrbファイルも丸ごとダウンロードして取り合えずbundle install
libsodium-1.0.18-msvc.zipをダウンロードしてx64/Release/v120/dynamic/libsodium.dllをsodium.dllに改名してC:\Windows\System32に設置
何が必要なことで何が要らないことなのか分からない為思い出せる限り入れたものやったことを書き込んでみました。
そも参考にしたサイトの方に詳しい前提アプリややり方等は載ってなかったので調べ調べであれやこれやと必要そうなものを突っ込んでいきました。
最終的に素人なりに目を凝らしてURIエラー?が出てるっぽい?からよくわからんけど「wss://japan286.discord.media:443:443」のWebSocketが繋がらないんか?と思って接続をテストしてみたんですが(多分)問題なく...
Dockerからエラーを出してるファイルを片っ端から引っ張り出して中身を覗いては調べてをしてみたんですが特に収穫はなく...
調べてる最中に想像以上にいろんな言語でBOT作れることを知りましたがここまで来た以上なんとかしてこれだけは完成させたいという気持ちもありまして...どうぞよろしくお願いいたします。
※追記
回答してくださった方の助言を元にGemfileを更新してコンベア内のRubyを2.7.0にアップデートしましたが当初と同じエラーが発生
WebSocketのURLの後ろの443が二つ付いてるのがダメなんじゃないかと素人なりに目星を付けて該当ファイル(/usr/local/lib/ruby/2.5.0/uri/rfc3986_parser.rb)内を下記のように書き換えてみましたが違ったエラーが発生
host = "wss://#{@endpoint}:443"
↓
host = "wss://#{@endpoint}"
長いので全文は割愛しちょこっとだけ周辺を記載↓
def init_ws host = "wss://#{@endpoint}" @bot.debug("Connecting VWS to host: #{host}") # Connect the WS @client = Discordrb::WebSocket.new( host, method(:websocket_open), method(:websocket_message), proc { |e| Discordrb::LOGGER.error "VWS error: #{e}" }, proc { |e| Discordrb::LOGGER.warn "VWS close: #{e}" } ) @bot.debug('VWS connected') # Block any further execution heartbeat_loop end
あなたの回答
tips
プレビュー