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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:06:05