朋友们

朋友们

一个完整的好友系统插件,允许玩家在您的服务器上连接、管理好友请求并追踪在线/离线状态。

杂项

Join us on Discord Star on GitHub Support me on Ko-fi

Friends 是一个完整的交友系统插件,能让你的服务器玩家互相交友。 发送好友请求、管理好友列表、屏蔽不想互动的玩家,并通过在线/离线好友追踪来保持联系。


命令:/friends 和 /friend (别名) 快速 UI 访问:/friends ui

权限:

friends - 允许玩家使用所有标准好友命令 friends.admin - 访问管理命令以管理好友

功能

好友系统

在服务器上建立并维护你的社交网络。

核心功能包括:

  • 好友请求 - 发送、接受、拒绝或取消好友请求
  • 好友列表 - 查看所有好友的在线/离线状态
  • 请求管理 - 追踪待处理的传入和传出好友请求
  • 自动清理 - 过期的请求会被自动移除(可配置)
  • 请求冷却 - 通过可配置的冷却计时器防止刷屏
  • 好友上限 - 每个玩家的可配置好友数量上限(默认:100)

隐私与控制

掌控你的社交体验:

  • 屏蔽系统 - 屏蔽玩家以阻止好友请求和互动
  • 隐私设置 - 切换是否接受好友请求
  • 通知设置 - 启用/禁用好友相关的通知
  • 屏蔽时自动删除好友 - 屏蔽会自动移除现有的好友关系

请求系统

智能的好友请求处理:

  • 自动接受 - 如果两个玩家互相发送了请求,系统会自动建立好友关系
  • 过期 - 请求在可配置的天数后过期(默认:7 天)
  • 冷却保护 - 速率限制防止请求刷屏(默认:5 分钟)
  • 互相检测 - 系统能智能检测并处理互发请求的情况

游戏内管理

命令系统

使用 /friends 后接子命令:

好友管理:

  • /friends add <玩家> - 发送好友请求
  • /friends accept <玩家> - 接受传入的请求
  • /friends deny <玩家> - 拒绝传入的请求
  • /friends cancel <玩家> - 取消你发出的请求
  • /friends unfriend <玩家> - 删除一位好友

信息:

  • /friends list - 查看你的好友(在线和离线)
  • /friends requests - 查看待处理的好友请求
  • /friends settings - 查看和管理你的设置

隐私:

  • /friends block <玩家> - 屏蔽一个玩家
  • /friends unblock <玩家> - 取消屏蔽一个玩家

设置:

  • /friends settings notifications - 切换好友通知
  • /friends settings requests - 切换是否接受好友请求

UI 访问:

  • /friends ui - 打开好友管理 UI

管理员命令

使用 /friends admin 进行服务器管理:

  • /friends admin lookup <玩家> - 查看玩家详细信息
  • /friends admin forcefriend <玩家1> <玩家2> - 强制建立好友关系
  • /friends admin forceunfriend <玩家1> <玩家2> - 强制解除好友关系
  • /friends admin clearrequests <玩家> - 清除所有待处理的请求
  • /friends admin reload - 重载配置

用户界面

Friends UI 提供了一个可视化界面来管理你的社交关系:

  • 查看带有在线/离线指示器的好友列表
  • 查看成为好友的时间戳
  • 管理传入和传出的请求
  • 快速接受/拒绝按钮
  • 访问设置和隐私控制

使用 /friends ui 打开。


数据库支持

Friends 同时支持 SQLiteMySQL 数据库:

SQLite (默认):

  • 无需额外设置
  • 数据存储在 mods/FriendsData/friends.db
  • 适合小型服务器

MySQL:

  • config.json 中配置
  • 支持连接池
  • 适合大型服务器或跨服务器设置

配置

config.json 文件允许你自定义:

{
  "database": {
    "type": "sqlite",
    "mysql": {
      "host": "localhost",
      "port": 3306,
      "database": "friends",
      "username": "root",
      "password": ""
    }
  },
  "maxFriends": 100,
  "requestExpiryDays": 7,
  "requestCooldownMinutes": 5,
  "cleanupIntervalMinutes": 60,
  "connectionPoolSize": 10
}

在线追踪

Friends 会自动追踪在线/离线状态:

  • 实时在线好友数量
  • 好友列表中的在线/离线指示器
  • 好友加入/离开通知(如果启用)
  • 最后上线时间戳

Discord / 支持

如果你想加入社区、建议功能、报告错误或需要帮助,请加入 Discord 社区! https://discord.gg/Snqz9E58Dr


支持 Friends

想支持 Friends?你可以通过 Ko-fi 捐赠,或者将 Friends 分享给你的服务器社区!


开发者 API

Friends 包含一个全面的开发者 API,用于以编程方式与好友系统集成。


获取插件实例:

FriendsPlugin plugin = FriendsPlugin.get();

获取 API:

FriendsAPI api = plugin.getAPI();

获取 FriendsManager:

FriendsManager manager = plugin.getFriendsManager();

加载档案

在访问好友数据之前,必须加载档案:

CompletableFuture<FriendsProfile> future = manager.loadProfile(playerUuid);
future.thenAccept(profile -> {
    // 档案现已加载并缓存
});

获取已加载的档案:

FriendsProfile profile = api.getProfile(playerUuid);

当玩家离开时卸载档案:

manager.unloadProfile(playerUuid);

好友操作

检查玩家是否为好友:

boolean areFriends = api.areFriends(player1Uuid, player2Uuid);

获取好友列表:

List<FriendData> friends = api.getFriends(playerUuid);
for (FriendData friend : friends) {
    UUID friendUuid = friend.getFriendUuid();
    long friendsSince = friend.getSince();
}

获取好友数量:

int count = api.getFriendCount(playerUuid);

获取在线好友:

List<UUID> onlineFriends = api.getOnlineFriends(playerUuid);
int onlineCount = api.getOnlineFriendsCount(playerUuid);

删除一位好友:

FriendsManager.FriendRequestResult result = api.removeFriend(playerUuid, friendUuid);
if (result == FriendsManager.FriendRequestResult.SUCCESS) {
    // 好友关系已删除
}

好友请求操作

发送好友请求:

FriendsManager.FriendRequestResult result = api.sendFriendRequest(senderUuid, receiverUuid);

switch (result) {
    case SUCCESS:
        // 请求发送成功
        break;
    case AUTO_ACCEPTED:
        // 互发请求 - 现在已是好友
        break;
    case ALREADY_FRIENDS:
        // 已经是好友
        break;
    case REQUEST_ALREADY_SENT:
        // 重复请求
        break;
    case PLAYER_BLOCKED:
        // 发送者已屏蔽接收者
        break;
    case BLOCKED_BY_PLAYER:
        // 接收者已屏蔽发送者
        break;
    case SENDER_FRIENDS_LIST_FULL:
    case RECEIVER_FRIENDS_LIST_FULL:
        // 好友列表已满
        break;
    case REQUEST_ON_COOLDOWN:
        // 发送下一个请求前必须等待
        break;
    // ... 其他情况
}

接受好友请求:

FriendsManager.FriendRequestResult result = api.acceptFriendRequest(receiverUuid, senderUuid);

拒绝好友请求:

FriendsManager.FriendRequestResult result = api.denyFriendRequest(receiverUuid, senderUuid);

取消发出的请求:

FriendsManager.FriendRequestResult result = api.cancelFriendRequest(senderUuid, receiverUuid);

获取待处理的请求:

List<FriendRequest> incoming = api.getIncomingRequests(playerUuid);
List<FriendRequest> outgoing = api.getOutgoingRequests(playerUuid);

for (FriendRequest request : incoming) {
    UUID senderUuid = request.getSenderUuid();
    long sentAt = request.getSentAt();
}

屏蔽操作

屏蔽一个玩家:

api.blockPlayer(playerUuid, targetUuid);

这会自动:

  • 删除现有的好友关系(如果有)
  • 取消玩家之间的待处理请求
  • 阻止未来的好友请求

取消屏蔽一个玩家:

api.unblockPlayer(playerUuid, targetUuid);

检查是否被屏蔽:

boolean isBlocked = api.isBlocked(playerUuid, targetUuid);

获取已屏蔽的玩家:

Set<UUID> blockedPlayers = api.getBlockedPlayers(playerUuid);

设置操作

获取玩家设置:

FriendSettings settings = api.getSettings(playerUuid);
if (settings != null) {
    boolean notificationsEnabled = settings.isNotificationsEnabled();
    boolean allowRequests = settings.isAllowRequests();
}

切换通知:

api.toggleNotifications(playerUuid);

切换是否接受请求:

api.toggleAllowRequests(playerUuid);

在线状态追踪

检查玩家是否在线:

boolean isOnline = api.isOnline(playerUuid);

获取所有在线玩家:

Set<UUID> onlinePlayers = api.getOnlinePlayers();

标记玩家在线/离线(由插件自动处理):

manager.markOnline(playerUuid);
manager.markOffline(playerUuid);

附加功能

获取共同好友:

List<UUID> mutualFriends = api.getMutualFriends(player1Uuid, player2Uuid);

获取最后上线时间戳:

long lastSeen = api.getLastSeen(playerUuid);

强制操作(管理员):

// 强制添加好友关系(绕过所有检查)
manager.forceAddFriend(player1Uuid, player2Uuid);

// 强制删除好友关系
manager.forceRemoveFriend(player1Uuid, player2Uuid);

// 清除某个玩家的所有请求
manager.clearAllRequests(playerUuid);

清理过期请求:

// 返回被删除的请求数量
int deleted = manager.cleanupExpiredRequests();

结果枚举

所有好友请求操作均返回一个 FriendRequestResult

public enum FriendRequestResult {
    SUCCESS,                           // 操作成功完成
    AUTO_ACCEPTED,                     // 互发请求创建了好友关系
    ALREADY_FRIENDS,                   // 玩家已经是好友
    NOT_FRIENDS,                       // 玩家不是好友
    REQUEST_ALREADY_SENT,              // 重复请求
    REQUEST_NOT_FOUND,                 // 请求不存在
    CANNOT_ADD_SELF,                   // 不能添加自己为好友
    SENDER_PROFILE_NOT_LOADED,         // 发送者档案未加载
    RECEIVER_PROFILE_NOT_LOADED,       // 接收者档案未加载
    RECEIVER_NOT_ACCEPTING_REQUESTS,   // 隐私设置阻止了请求
    PLAYER_BLOCKED,                    // 发送者已屏蔽接收者
    BLOCKED_BY_PLAYER,                 // 接收者已屏蔽发送者
    SENDER_FRIENDS_LIST_FULL,          // 发送者好友已达上限
    RECEIVER_FRIENDS_LIST_FULL,        // 接收者好友已达上限
    REQUEST_ON_COOLDOWN                // 必须等待才能重试
}

配置 API

重载配置:

plugin.reloadConfig();

获取配置值:

int maxFriends = plugin.getMaxFriends();
int requestExpiryDays = plugin.getRequestExpiryDays();

鸣谢

本插件的诞生离不开 HyUI