Love2D Lua脚本无法接收Twitch IRC消息求助
在Love2D中接收Twitch IRC消息的实现方法
我来帮你搞定这个问题!首先得提醒你,连接成功后必须先完成Twitch IRC的认证流程,不然Twitch不会给你推送任何消息。你当前的代码只做了连接,还没发送必要的认证指令,这是第一步要补的。
步骤1:补全Twitch IRC认证流程
在love.load()里连接成功后,需要发送三条核心指令才能和Twitch IRC建立有效通信:
- 发送OAuth认证令牌
- 设置机器人的昵称
- 加入目标频道(注意频道名必须小写)
修改后的love.load()代码如下:
function love.load() oauth = "oauth:someoauthhere" user = "botname" channel = "channeltojoin" -- 这里务必改成小写的频道名 love.graphics.setFont(love.graphics.newFont(32)) socket = require("socket") irc = socket.tcp() -- 设置超时为0,避免阻塞游戏主循环 irc:settimeout(0) connect = irc:connect("irc.chat.twitch.tv", 6667) if connect == 1 then -- 发送认证指令,每条指令结尾必须加\r\n irc:send("PASS " .. oauth .. "\r\n") irc:send("NICK " .. user .. "\r\n") irc:send("JOIN #" .. channel .. "\r\n") -- 创建数组存储收到的IRC消息 irc_messages = {} end end
步骤2:在love.update()中接收并处理消息
Twitch IRC的消息是以\r\n分隔的,我们需要在love.update()循环里不断尝试接收数据,然后分割成单条消息处理——特别要注意回复Twitch的PING指令,不然会被服务器断开连接。
直接上love.update()的实现代码:
function love.update(dt) if connect ~= 1 then return end -- 未连接成功则跳过 -- 尝试接收所有可用数据,因设置了超时0,无数据时会返回nil+错误信息 local data, err = irc:receive("*a") if data and data ~= "" then -- 把收到的原始数据分割成单条消息 local messages = split(data, "\r\n") for _, msg in ipairs(messages) do if msg ~= "" then -- 处理PING指令,必须回复PONG,否则会被Twitch踢下线 if msg:sub(1, 4) == "PING" then irc:send("PONG " .. msg:sub(6) .. "\r\n") else -- 把消息存入数组,方便后续显示或处理 table.insert(irc_messages, msg) -- 这里可以自定义解析逻辑,比如提取用户名和聊天内容 parse_chat_message(msg) end end end end -- 可选:限制消息存储数量,避免内存占用过高 while #irc_messages > 20 do table.remove(irc_messages, 1) end end
辅助工具函数:分割字符串与解析聊天内容
上面用到的split字符串分割函数和聊天消息解析函数需要自己实现,代码如下:
-- 分割字符串的工具函数,按指定分隔符拆分 function split(str, sep) local result = {} for s in str:gmatch("([^"..sep.."]+)") do table.insert(result, s) end return result end -- 解析Twitch聊天消息,提取用户名和具体内容 function parse_chat_message(msg) -- Twitch聊天消息格式::用户名!用户名@用户名.tmi.twitch.tv PRIVMSG #频道名 :聊天内容 local user_start = msg:find(":") + 1 local user_end = msg:find("!") - 1 local username = msg:sub(user_start, user_end) local msg_start = msg:find(":", 2) + 1 local message = msg:sub(msg_start) -- 在控制台打印解析后的聊天内容,方便调试 print(username .. ": " .. message) end
可选:在love.draw()中显示消息
如果想在游戏窗口里直观展示收到的消息,可以添加love.draw()函数:
function love.draw() if connect ~= 1 then love.graphics.print("连接Twitch IRC失败!", 50, 50) return end love.graphics.print("Twitch聊天消息:", 50, 50) for i, msg in ipairs(irc_messages) do love.graphics.print(msg, 50, 80 + (i * 35)) end end
这样整套流程就通顺了:连接成功→完成认证→在update循环中接收消息→处理PING和解析聊天内容→可选显示消息。
内容的提问来源于stack exchange,提问作者Tearzz
相关产品推荐
相关产品推荐

