You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:34:47