如何让Discord机器人绑定的Steam账号主动发送好友申请
Steam主动发送好友申请功能实现方案
核心逻辑
- 在用户触发Discord绑定/段位查询指令时,先校验用户提供的SteamID合法性
- 调用steam-user库的
addFriend方法向目标SteamID发起好友申请 - 配套你现有的
friendRelationship事件监听逻辑,处理用户通过好友申请后的后续验证、段位查询、身份组分配操作
具体代码实现
1. 新增主动加好友触发逻辑(绑定到Discord对应指令)
// 该方法在用户发送绑定/查询指令时触发,参数分别为触发指令的Discord用户ID、用户输入的SteamID、指令所在频道ID、触发的消息对象 async function handleSteamBindCommand(discordUserId, inputSteamId, channelId, triggerMessage) { // 校验SteamID格式合法性,需提前安装steamid依赖 let targetSid; try { targetSid = new SteamID(inputSteamId); } catch (e) { await triggerMessage.reply("你输入的SteamID格式无效,请提供正确的64位SteamID"); return; } // 检查双方是否已经是好友,是则直接走后续验证流程 const existingRelation = steamClient.myFriends[targetSid.getSteamID64()]; if (existingRelation === SteamUser.EFriendRelationship.Friend) { await queryCsgoRankAndAssignRole(discordUserId, targetSid, channelId); return; } // 将该用户写入待验证映射表,后续好友通过时可匹配到对应的Discord用户 onGoing.set(discordUserId, { steamid: targetSid.getSteamID64(), channel: channelId, message: triggerMessage }); // 发起好友申请,第二个参数为好友申请附言,可自定义 const addResult = await steamClient.addFriend(targetSid, "你正在申请绑定CSGO段位查询机器人,请通过好友申请完成验证"); if (addResult) { await triggerMessage.reply("好友申请已发送至你提供的Steam账号,请通过申请后系统将自动完成段位验证与身份组分配"); } else { await triggerMessage.reply("好友申请发送失败,请确认SteamID正确,且账号未开启禁止陌生人添加好友的设置"); onGoing.delete(discordUserId); // 申请发送失败清除待验证记录 } }
2. 补全现有friendRelationship事件的后续处理逻辑
你当前提供的代码仅完成了匹配待验证用户的前置判断,需要补充后续的业务逻辑:
steamClient.on('friendRelationship', async (sid, relationship) => { // 当双方关系变为好友时触发 if (relationship === SteamUser.EFriendRelationship.Friend) { let found = undefined; // 遍历待验证映射表匹配对应的Discord用户 onGoing.forEach((value, key) => { if (value.steamid === sid.getSteamID64()) { found = { discord: key, steam: sid.getSteamID64(), channel: value.channel, message: value.message }; } }); // 非主动发起申请的陌生好友直接移除 if (found === undefined) { steamClient.removeFriend(sid); return; } // 调用现有逻辑查询CSGO段位并分配对应身份组 await queryCsgoRankAndAssignRole(found.discord, sid, found.channel); // 处理完成后清除待验证记录 onGoing.delete(found.discord); } }); // 段位查询与身份组分配封装方法,可直接替换为你现有的业务逻辑 async function queryCsgoRankAndAssignRole(discordUserId, steamSid, channelId) { // 调用你的现有CSGO段位查询接口/逻辑 const userRank = await getCsgoRank(steamSid); // 从段位和身份组的映射表中获取对应身份组ID const targetRoleId = rankToRoleMap[userRank]; // 获取服务器对象和用户对象 const targetGuild = client.guilds.cache.get("你的Discord服务器ID"); const targetMember = await targetGuild.members.fetch(discordUserId); // 为用户分配身份组 await targetMember.roles.add(targetRoleId); // 发送完成通知 await client.channels.cache.get(channelId).send(`<@${discordUserId}> 验证完成,已为你分配${userRank}段位对应的身份组`); }
注意事项
- 需提前安装
steamid依赖用于校验SteamID格式 - Steam对账号发送好友申请有频率限制,短时间内大量发起申请会被限制功能,建议添加限流逻辑
- 若目标用户Steam设置了禁止陌生人添加好友,会导致申请发送失败,可提前在指令说明中告知用户检查相关设置
内容的提问来源于stack exchange,提问作者lns
相关产品推荐
相关产品推荐

