├── .idea
├── .gitignore
├── codeStyles
│ └── codeStyleConfig.xml
├── compiler.xml
├── dictionaries
│ ├── Arasp.xml
│ └── sky.xml
├── encodings.xml
├── gradle.xml
├── hotswap_agent.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── jarRepositories.xml
├── libraries
│ ├── Gradle__io_izzel_taboolib_TabooLib_all_5_17.xml
│ ├── Gradle__io_izzel_taboolib_loader_TabooLibloader_all_1_4.xml
│ ├── Gradle__me_clip_placeholderapi_2_10_4.xml
│ ├── Gradle__org_bstats_bstats_bukkit_1_7.xml
│ └── Gradle__org_spigotmc_spigot_1_15_2_R0_1_SNAPSHOT.xml
├── misc.xml
├── modules.xml
├── modules
│ ├── TrChat.iml
│ ├── TrChat.main.iml
│ └── TrChat.test.iml
├── uiDesigner.xml
└── vcs.xml
├── README.md
├── UPDATES_CN.md
├── UPDATES_EN.md
├── build.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── libs
├── BungeeCord.jar
└── PlaceholderAPI.jar
├── settings.gradle
└── src
└── main
├── java
└── me
│ └── arasple
│ └── mc
│ └── trchat
│ ├── TrChat.java
│ ├── TrChatBungee.java
│ ├── TrChatFiles.java
│ ├── TrChatLoader.java
│ ├── api
│ └── TrChatAPI.java
│ ├── bstats
│ ├── Metrics.java
│ ├── MetricsBukkit.java
│ └── MetricsBungee.java
│ ├── bungee
│ └── ListenerBungeeTransfer.java
│ ├── channels
│ ├── ChannelGlobal.java
│ ├── ChannelPrivate.java
│ └── ChannelStaff.java
│ ├── chat
│ ├── ChatFormats.java
│ ├── format
│ │ ├── Format.java
│ │ ├── PriFormat.java
│ │ └── objects
│ │ │ ├── JsonComponent.java
│ │ │ └── MsgComponent.java
│ ├── listeners
│ │ ├── ListenerAnvilChange.java
│ │ ├── ListenerBookEdit.java
│ │ ├── ListenerChatEvent.java
│ │ ├── ListenerCommandController.java
│ │ ├── ListenerSignChange.java
│ │ ├── ListenerTabComplete.java
│ │ └── ListenerTrChatInfo.java
│ └── obj
│ │ └── ChatType.java
│ ├── cmds
│ ├── CommandFilter.java
│ ├── CommandGlobalShout.java
│ ├── CommandPrivateMessage.java
│ ├── CommandReply.java
│ └── CommandStaffChat.java
│ ├── data
│ ├── Cooldowns.java
│ └── Users.java
│ ├── filter
│ ├── ChatFilter.java
│ ├── listeners
│ │ └── PacketListener.java
│ └── processer
│ │ ├── BCConvert.java
│ │ ├── Filter.java
│ │ ├── FilterSet.java
│ │ ├── FilteredObject.java
│ │ └── WordNode.java
│ ├── func
│ ├── ChatFunctions.java
│ └── imp
│ │ └── Function.java
│ ├── hook
│ └── TrChatPlaceholders.java
│ ├── logs
│ └── ChatLogs.java
│ ├── menus
│ └── MenuFilterControl.java
│ ├── nms
│ ├── AbstractPacketUtils.java
│ └── InternalPacketUtils.java
│ ├── updater
│ └── Updater.java
│ └── utils
│ ├── Bungees.java
│ ├── Js.java
│ ├── MessageColors.java
│ ├── Notifys.java
│ ├── PacketUtils.java
│ ├── Players.java
│ ├── Pts.java
│ └── Vars.java
└── resources
├── bungee.yml
├── channels.yml
├── filter.yml
├── formats.yml
├── function.yml
├── lang
├── en_US.yml
├── zh_CN.yml
└── zh_TW.yml
├── plugin.yml
└── settings.yml
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Default ignored files
3 | /workspace.xml
4 | /.gradle
5 | /.idea
6 | /gradle
7 | /libs
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/dictionaries/Arasp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | arasple
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/dictionaries/sky.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | cooldown
5 | cooldowns
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/hotswap_agent.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__io_izzel_taboolib_TabooLib_all_5_17.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__io_izzel_taboolib_loader_TabooLibloader_all_1_4.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__me_clip_placeholderapi_2_10_4.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_bstats_bstats_bukkit_1_7.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_spigotmc_spigot_1_15_2_R0_1_SNAPSHOT.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | Class structureJava
23 |
24 |
25 | Code maturityJava
26 |
27 |
28 | Google Web Toolkit
29 |
30 |
31 | JUnitJava
32 |
33 |
34 | Java
35 |
36 |
37 | Java 5Java language level migration aidsJava
38 |
39 |
40 | Java 7Java language level migration aidsJava
41 |
42 |
43 | Java 8Java language level migration aidsJava
44 |
45 |
46 | Java language level migration aidsJava
47 |
48 |
49 | JavadocJava
50 |
51 |
52 | Numeric issuesJava
53 |
54 |
55 | PerformanceJava
56 |
57 |
58 | PortabilityJava
59 |
60 |
61 | Probable bugsJava
62 |
63 |
64 | Resource managementJava
65 |
66 |
67 | Spring
68 |
69 |
70 | Spring AOPSpring
71 |
72 |
73 | TestNGJava
74 |
75 |
76 | Threading issuesJava
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/modules/TrChat.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | BUNGEECORD
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/.idea/modules/TrChat.main.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | SPIGOT
8 | BUNGEECORD
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/.idea/modules/TrChat.test.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | SPIGOT
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/.idea/uiDesigner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
7 |
8 | -
9 |
10 |
11 | -
12 |
13 |
14 | -
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 | -
24 |
25 |
26 |
27 |
28 |
29 | -
30 |
31 |
32 |
33 |
34 |
35 | -
36 |
37 |
38 |
39 |
40 |
41 | -
42 |
43 |
44 |
45 |
46 | -
47 |
48 |
49 |
50 |
51 | -
52 |
53 |
54 |
55 |
56 | -
57 |
58 |
59 |
60 |
61 | -
62 |
63 |
64 |
65 |
66 | -
67 |
68 |
69 |
70 |
71 | -
72 |
73 |
74 | -
75 |
76 |
77 |
78 |
79 | -
80 |
81 |
82 |
83 |
84 | -
85 |
86 |
87 |
88 |
89 | -
90 |
91 |
92 |
93 |
94 | -
95 |
96 |
97 |
98 |
99 | -
100 |
101 |
102 | -
103 |
104 |
105 | -
106 |
107 |
108 | -
109 |
110 |
111 | -
112 |
113 |
114 |
115 |
116 | -
117 |
118 |
119 | -
120 |
121 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # TrChat
2 | Advanced chat control for Minecraft servers
3 |
--------------------------------------------------------------------------------
/UPDATES_CN.md:
--------------------------------------------------------------------------------
1 | # TrChat Update Logs #
2 |
3 | #### VERSION 1.8
4 | ```
5 | - 这将会是 TrChat 的最后一个版本,
6 | - 无新增内容, 主要是修复一些小问题和优化
7 |
8 | - 注意, 1.13+ 的命令补全绕过权限是: trchat.bypass.tabcomplete
9 | ```
10 |
11 | #### VERSION 1.7
12 | - #### 1.70
13 | - Since: 2020.1.15
14 | - Updates:
15 | - 新增 en_US 语言,默认
16 | - 更新 TabooLib 至 5.14
17 | - 相关配置文件的默认注释更改为英文
18 | - 发布至 SpigotMC
19 | - 修复了 v1.62 中的空指针报错
20 | - 默认情况下关闭云端词库
21 | - R2
22 | - 优化了英文语言下物品名称获取方式
23 | - 新增 Command Controller 命令控制系统, 黑白名单任选
24 | - ^ 支持正则表达式匹配、自定义参数是否忽略、绕过权限以及 TLocale 反馈消息
25 | - ^ (请参考新版本,手动添加新的配置项)
26 | - R3
27 | - CommandController 将自动检测别称命令的主命令判断
28 | - 修复了 Function 模块的 {0} 变量无法在 text 中使用
29 | #### VERSION 1.6
30 | - ##### 1.62
31 | - DATE: 2019.12.1
32 | - OVERVIEW:
33 | - 修复了 Bungee 版不工作
34 | - 现在单个 JSON 组件也支持使用 "Requirement" 属性
35 | - 移除调试信息
36 | - 强制全局喊话现在将记录在后台
37 | - 修复了跨服私聊变量报错
38 | - 修复同服 At 重复的问题
39 | - 现支持在全局喊话中 At 玩家
40 | - 过滤器菜单别称新增 /chatfilter, /trfilter
41 | - 修复了云端词库 连不上/不显示 的问题
42 | - 修复了聊天日志不能追加写入的问题
43 | - 新增语言项支持自定义监听聊天的格式
44 | - 支持 1.15 版本
45 | - 修复了一个数据包监听报错
46 | - 新增强制全局喊话的前缀
47 | - 修复了 PlaceholderAPI 下载链接失效
48 | - 修复了铁砧敏感词库无法过滤的问题
49 | - ##### 1.61
50 | - DATE: 2019.11.30
51 | - OVERVIEW:
52 | - 修正裁剪了敏感词库
53 | - 修复了监听格式错误
54 | - 修复了 JSON 模块悬浮信息末尾少了字符
55 | - 新增手动重载方式,聊天框内喊:"#TRCHAT-RELOAD"
56 | - ##### 1.6 :)
57 | - DATE: 2019.11.30
58 | - OVERVIEW:
59 | - 该版本重制了许多的内容,重构了大量模块
60 | - 为了顺利更新到新版本,你需要删除旧文件夹
61 | - 敬请享用 :)
62 | - LOG:
63 | - 优化了更新检测器
64 | - 新增检测提醒用户删除旧版本文件夹
65 | - 优化、重写了大量代码
66 | - 配置文件结构革新
67 | - PlaceholderAPI 为必需前置,若未安装将自动下载重启
68 | 
69 | - 功能性:
70 | - 聊天日志,记录存储详尽的内容
71 | - 改进聊天控制系统
72 | - 新增反复读
73 | - 匹配文本相似度
74 | - 自定义 TLocale 提示
75 | - 过滤器:
76 | - 云端词库新增大量内容, 1.2w+
77 | - 云端词库新增阿里云镜像,双重下载源保障
78 | - 监听多种数据包处理过滤
79 | - 每名玩家独立的开关配置
80 | - 可视化 GUI 控制过滤器开关
81 | 
82 | - 聊天格式:
83 | - 优先级筛选支持使用 JS 表达式
84 | - 聊天频道:
85 | - 现在支持强制全局聊天
86 | - 聊天功能:
87 | - 新增 URL展示,将链接缩短为一个自定义格式的 JSON 模块
88 | - 新增 B站分享,将av号视频缩短为一个超链接 JSON 模块
89 | - 新增 手机号/身份证 屏蔽隐藏为 JSON 模块
90 | - 新增 QQ号快速分享,缩短为一个超链接 JSON 模块
91 | - 不仅如此,你可以自定义编辑匹配,触发替换内容
92 | 
93 | 
94 | 
95 |
96 | #### VERSION 1.5
97 | - ##### 1.51
98 | - 修复了部分情况下 PlaceholderAPI 的报错
99 | - 修复了配置文件控制颜色代码开关无效的问题
100 | - 新增了强制默认聊天颜色的权限节点 trchat.color.force-defaultcolor
101 | - 屏蔽了 bStats 的一个报错
102 | - 优化了更新检测器
103 |
104 | #### Old logs
105 | Version 1.5:
106 | Date: 2019.10.19
107 | Updates:
108 | - 改进部分代码
109 | - 修复 "functions" 命名错误
110 | - 修复了一些报错
111 | - 正式改名为 TrChat, 更新介绍图
112 |
113 | Version 1.4:
114 | Date: 2019.10.12
115 | Updates:
116 | - [!] 该版本重制配置文件内容较多, 请备份+删除 TrChat文件夹 后更新
117 | - >>
118 | - 配置文件重写, 分为 settings.yml / formats.yml / filter.yml / functions.yml
119 | - 云端敏感词库上线, 自动更新敏感词、支持自定义白名单词 (正在持续增加中)
120 | - 每个聊天频道均支持多个自定义聊天格式,优先级权限筛选
121 | - 添加了一个选项,可以自动下载并载入指定PAPI变量拓展
122 | - 修复了1.12展示物品报错
123 | - 修复了旧版本的各种错误、漏洞
124 | - 移除了 PerWorldChat 功能
125 |
126 | Version 1.3X:
127 | Date: 2019.8.30 - 2019.9.13
128 | Updates:
129 | 1.31:
130 | - 新增 @At 在线玩家功能 (音效+TITLE提示/忽略大小写式判断/自定义At文字高亮)
131 | 1.32:
132 | - 修复消息默认彩色代码配置问题
133 | - 现在颜色代码也可以在编辑书中使用(需要指定权限)
134 | 1.33:
135 | - 修复玩家数据报错
136 | - 修复API事件不被call
137 | - 自动更新配置文件选项
138 | - 聊天内容的发包将改为 CHAT 类型
139 | - 依赖更至 Taboolib v5.04
140 | 1.34:
141 | - 修复 <> 中内容消失的问题
142 | - 禁止在私聊中At玩家
143 | - 新增At玩家的冷却 (常规/单个玩家冷却)
144 | - 缓存展示物品,提高性能
145 | 1.35:
146 | - 修复了数据读写的问题
147 | - 修复了v1.34新增的BUG
148 | - 重写了更新检测器
149 | - 移除了控制面板
150 | - 新增聊天内容字符长度的限制
151 | 1.36:
152 | - 增加了更多 bStats 自定义统计项
153 | - 修复了私聊中过滤器绕过权限无效的问题
154 | - 改进了过滤器
155 | 1.37:
156 | - 修复了 GlobalShoutEvent & PrivateMessageEvent
157 | - 修复了 私聊报错问题
158 | - 现在可以通过 "[展示物品变量]-[槽位]" 来展示背包指定位置的物品
159 | - 👆 例如 %i-0 ~ %i-9
160 | 1.38:
161 | - 修复了1.12版无法全局喊话问题
162 | 1.39:
163 | - 修复了At功能
164 |
165 | Version 1.3:
166 | Date: 2019.8.18
167 | Updates:
168 | - 依赖更新至 Taboolib v5.03
169 | - 改进了基于权限的彩聊代码处理
170 | - 改进了插件部分服务注入方式
171 | - 改进了控制面板GUI跨版本物品兼容
172 | - 改进了私聊频道代码
173 | - 改进了物品展示处理方式
174 | - 修复了自定义物品展示代码失效
175 | - 一条消息现在支持同时展示多个物品
176 | - 改由 Taboolib 存储数据
177 | - 新增命令 /spy, 在游戏内切换是否监听玩家私聊
178 | - 现在颜色代码的权限支持木牌/铁砧使用彩色代码!
179 | - 新增多个配置节点决定是否启用颜色代码功能
180 | - 炫酷的载入文字画LOGO (可修改/关闭)
181 | - bStats 更换为 MetricsLite 并优化, 减小了插件体积
182 | - 提供了牛逼的API (TrChatAPI) 方便自定义拓展
183 | - LChatPrivateMessageEvent - API 私聊事件
184 | - LChatShoutEvent - API 私聊事件
185 | - 配置文件大改, 新增配置版号 (自动备份更新)
186 |
187 | Version 1.2:
188 | Date: 2019.8.17 20:30
189 | Updates:
190 | - 支持 CatServer
191 | - 全局喊话将强制要求Bungee启用, 否则则提示玩家
192 | - 修复了聊天冷却发送时事件未取消的问题
193 | - 更新通知新增 Mcbbs 地址
194 |
195 | Version 1.1:
196 | Date: 2019.8.17 13:30
197 | Updates:
198 | - 优化代码
199 | - 自动读取 spigot.yml 配置判断是否启用 Bungee 支持
200 | - 管理频道支持单独 Spigot 使用
201 | - 现在即使未在管理频道, 也可通过/staff [MESSAGE]发送管频消息
202 | - 改进BungeeCord的监听器
203 |
204 | Version 1.0:
205 | Date: 2019.8.16
206 | Updates:
207 | - 正式版
--------------------------------------------------------------------------------
/UPDATES_EN.md:
--------------------------------------------------------------------------------
1 | # TrChat Update Logs #
2 |
3 | #### VERSION 1.7
4 | - #### 1.70
5 | - Since: 2020.1.15
6 | - Updates:
7 | - Added en_US locale as default
8 | - Update TabooLib to 5.14
9 | - Fixed a error in v1.62
10 | - R2
11 | - Fixed item-display can not get the local item name
12 | - Added Command Controller, white/black list for commands
13 | - ^ Support regex, arguments ignore, bypass permission and TLocale response
14 | - ^ (Please refer to the new version and manually update the settings)
15 | - R3
16 | - Command Controller will now check aliases of command
17 | - Fixed a variable issue in function.yml
18 | - R4
19 | - Fixed small bugs
20 | - Added anti-tab for 1.13+, bypass permission `trchat.bypass.tabcomplete`
21 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | import java.text.SimpleDateFormat
2 |
3 | plugins {
4 | id 'java'
5 | id 'com.github.johnrengelman.shadow' version '4.0.4'
6 | }
7 |
8 | configurations {
9 | group = 'me.arasple.mc.trchat'
10 | version = '1.71'
11 |
12 | sourceCompatibility = 1.8
13 | targetCompatibility = 1.8
14 |
15 | tasks.withType(JavaCompile) {
16 | options.encoding = 'UTF-8'
17 | }
18 |
19 | defaultTasks 'buildJar'
20 | }
21 |
22 | task buildJar(dependsOn: [clean, shadowJar])
23 |
24 | repositories {
25 | maven { url "https://maven.aliyun.com/repository/central" }
26 | maven { url "http://ptms.ink:8081/repository/codemc-nms/" }
27 | maven { url "http://ptms.ink:8081/repository/maven-releases/" }
28 | maven { url "https://hub.spigotmc.org/nexus/content/repositories/snapshots/" }
29 | maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
30 | maven { url "https://repo.codemc.org/repository/maven-public" }
31 | maven { url "http://repo.extendedclip.com/content/repositories/placeholderapi/" }
32 | maven { url "https://jitpack.io" }
33 | mavenCentral()
34 | }
35 |
36 | dependencies {
37 | compile 'org.spigotmc:spigot:1.15.2-R0.1-SNAPSHOT'
38 | compile 'org.bstats:bstats-bukkit:1.7'
39 | compile 'io.izzel.taboolib:TabooLib:5.17:all'
40 | compile 'io.izzel.taboolib.loader:TabooLibloader:1.4:all'
41 | compile 'me.clip:placeholderapi:2.10.4'
42 | shadow fileTree(dir: 'libs', includes: ['*.jar'])
43 | }
44 |
45 | shadowJar {
46 | dependencies {
47 | include(dependency('org.bstats:bstats-bukkit:1.7'))
48 | include(dependency('io.izzel.taboolib.loader:TabooLibloader:1.4:all'))
49 | }
50 | relocate "io.izzel.taboolib.loader", project.group
51 | relocate "org.bstats.bukkit", "me.arasple.mc.trhologram.bstats"
52 | }
53 |
54 | processResources {
55 | from(sourceSets.main.resources.srcDirs) {
56 | include 'plugin.yml'
57 | expand 'version': project.version, 'built': new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss.SSSZ").format(new Date())
58 | }
59 | }
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Arasple/TrChat/e44eb5d25b5e16482b6b92496d95555c1a8451cd/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sat Dec 14 18:26:04 CST 2019
2 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip
3 | distributionBase=GRADLE_USER_HOME
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/libs/BungeeCord.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Arasple/TrChat/e44eb5d25b5e16482b6b92496d95555c1a8451cd/libs/BungeeCord.jar
--------------------------------------------------------------------------------
/libs/PlaceholderAPI.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Arasple/TrChat/e44eb5d25b5e16482b6b92496d95555c1a8451cd/libs/PlaceholderAPI.jar
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = 'TrChat'
2 |
--------------------------------------------------------------------------------
/src/main/java/me/arasple/mc/trchat/TrChat.java:
--------------------------------------------------------------------------------
1 | package me.arasple.mc.trchat;
2 |
3 | import io.izzel.taboolib.loader.Plugin;
4 | import io.izzel.taboolib.module.inject.TInject;
5 |
6 | /**
7 | * @author Arasple
8 | */
9 | @Plugin.Version(5.17)
10 | public final class TrChat extends Plugin {
11 |
12 | @TInject(state = TInject.State.STARTING, init = "init", active = "load", cancel = "unload")
13 | private static TrChatLoader loader;
14 |
15 | public static double getTrVersion() {
16 | return 1.71;
17 | }
18 |
19 | }
--------------------------------------------------------------------------------
/src/main/java/me/arasple/mc/trchat/TrChatBungee.java:
--------------------------------------------------------------------------------
1 | package me.arasple.mc.trchat;
2 |
3 | import me.arasple.mc.trchat.bstats.MetricsBungee;
4 | import me.arasple.mc.trchat.bungee.ListenerBungeeTransfer;
5 | import net.md_5.bungee.api.plugin.Plugin;
6 |
7 | /**
8 | * @author Arasple
9 | * @date 2019/8/4 22:42
10 | */
11 | public class TrChatBungee extends Plugin {
12 |
13 | @Override
14 | public void onEnable() {
15 | new MetricsBungee(this);
16 | getProxy().getPluginManager().registerListener(this, new ListenerBungeeTransfer());
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/me/arasple/mc/trchat/TrChatFiles.java:
--------------------------------------------------------------------------------
1 | package me.arasple.mc.trchat;
2 |
3 | import io.izzel.taboolib.module.config.TConfig;
4 | import io.izzel.taboolib.module.inject.TInject;
5 | import io.izzel.taboolib.module.inject.TSchedule;
6 | import me.arasple.mc.trchat.chat.ChatFormats;
7 | import me.arasple.mc.trchat.filter.ChatFilter;
8 | import me.arasple.mc.trchat.func.ChatFunctions;
9 |
10 | /**
11 | * @author Arasple
12 | * @date 2019/11/30 9:59
13 | */
14 | public class TrChatFiles {
15 |
16 | @TInject(value = "settings.yml", locale = "LOCALE-PRIORITY")
17 | private static TConfig settings;
18 | @TInject("formats.yml")
19 | private static TConfig formats;
20 | @TInject("filter.yml")
21 | private static TConfig filter;
22 | @TInject("function.yml")
23 | private static TConfig function;
24 | @TInject("channels.yml")
25 | private static TConfig channels;
26 |
27 | @TSchedule
28 | public static void init() {
29 | filter.listener(() -> ChatFilter.loadFilter(false)).runListener();
30 | formats.listener(ChatFormats::loadFormats).runListener();
31 | function.listener(ChatFunctions::loadFunctions).runListener();
32 | }
33 |
34 | public static TConfig getSettings() {
35 | return settings;
36 | }
37 |
38 | public static TConfig getFormats() {
39 | return formats;
40 | }
41 |
42 | public static TConfig getFilter() {
43 | return filter;
44 | }
45 |
46 | public static TConfig getFunction() {
47 | return function;
48 | }
49 |
50 | public static TConfig getChannels() {
51 | return channels;
52 | }
53 |
54 | }
55 |
--------------------------------------------------------------------------------
/src/main/java/me/arasple/mc/trchat/TrChatLoader.java:
--------------------------------------------------------------------------------
1 | package me.arasple.mc.trchat;
2 |
3 | import io.izzel.taboolib.module.locale.TLocale;
4 | import io.izzel.taboolib.util.Files;
5 | import me.arasple.mc.trchat.chat.ChatFormats;
6 | import me.arasple.mc.trchat.filter.ChatFilter;
7 | import me.arasple.mc.trchat.func.ChatFunctions;
8 | import me.arasple.mc.trchat.updater.Updater;
9 | import me.arasple.mc.trchat.utils.Bungees;
10 | import org.bukkit.Bukkit;
11 | import org.bukkit.plugin.Plugin;
12 |
13 | import java.io.File;
14 | import java.util.Arrays;
15 | import java.util.List;
16 |
17 | /**
18 | * @author Arasple
19 | * @date 2019/11/29 15:05
20 | */
21 | public class TrChatLoader {
22 |
23 | private List motd = Arrays.asList(
24 | "",
25 | "§3 ___________ _________ .__ __",
26 | "§3 \\__ __________\\_ ___ \\| |__ _____ _/ |_",
27 | "§3 | | \\_ __ / \\ \\/| | \\\\__ \\\\ __\\",
28 | "§3 | | | | \\\\ \\___| Y \\/ __ \\| |",
29 | "§3 |____| |__| \\______ |___| (____ |__|",
30 | "§3 \\/ \\/ \\/ ");
31 |
32 | void init() {
33 | motd.forEach(l -> Bukkit.getConsoleSender().sendMessage(l));
34 | TLocale.sendToConsole("PLUGIN.LOADED");
35 |
36 | if (hookPlaceholderAPI()) {
37 | return;
38 | }
39 | // Updater
40 | Updater.init(TrChat.getPlugin());
41 | // Chat Filter
42 | ChatFilter.loadFilter(true, Bukkit.getConsoleSender());
43 | // Chat Formats
44 | ChatFormats.loadFormats(Bukkit.getConsoleSender());
45 | // Chat Functions
46 | ChatFunctions.loadFunctions(Bukkit.getConsoleSender());
47 | // Bungees
48 | Bungees.init();
49 | }
50 |
51 |
52 | void load() {
53 | TLocale.sendToConsole("PLUGIN.ENABLED", TrChat.getPlugin().getDescription().getVersion());
54 | }
55 |
56 | void unload() {
57 | TLocale.sendToConsole("PLUGIN.DISABLED");
58 | }
59 |
60 | /**
61 | * 检测前置 PlaceholderAPI
62 | * 并自动下载、重启服务器
63 | */
64 | private boolean hookPlaceholderAPI() {
65 | Plugin plugin = Bukkit.getPluginManager().getPlugin("PlaceholderAPI");
66 | File jarFile = new File("plugins/PlaceholderAPI.jar");
67 | String url = "https://api.spiget.org/v2/resources/6245/download";
68 |
69 | if (plugin == null) {
70 | jarFile.delete();
71 | TLocale.sendToConsole("PLUGIN.DEPEND.DOWNLOAD", "PlaceholderAPI");
72 | if (Files.downloadFile(url, jarFile)) {
73 | TLocale.sendToConsole("PLUGIN.DEPEND.INSTALL", "PlaceholderAPI");
74 | Bukkit.shutdown();
75 | } else {
76 | TLocale.sendToConsole("PLUGIN.DEPEND.INSTALL-FAILED", "PlaceholderAPI");
77 | Bukkit.shutdown();
78 | }
79 | return true;
80 | }
81 | return false;
82 | }
83 |
84 | }
85 |
--------------------------------------------------------------------------------
/src/main/java/me/arasple/mc/trchat/api/TrChatAPI.java:
--------------------------------------------------------------------------------
1 | package me.arasple.mc.trchat.api;
2 |
3 | import me.arasple.mc.trchat.filter.processer.Filter;
4 | import me.arasple.mc.trchat.filter.processer.FilteredObject;
5 | import org.bukkit.entity.Player;
6 |
7 | /**
8 | * @author Arasple
9 | * @date 2019/8/18 0:18
10 | */
11 | public class TrChatAPI {
12 |
13 | /**
14 | * 根据玩家的权限,过滤的字符串
15 | *
16 | * @param player 玩家
17 | * @param string 字符串
18 | * @return 过滤后的
19 | */
20 | public static FilteredObject filterString(Player player, String string) {
21 | return Filter.doFilter(string, !player.hasPermission("trchat.bypass.filter"));
22 | }
23 |
24 | public static FilteredObject filterString(Player player, String string, boolean execute) {
25 | return execute ? filterString(player, string) : new FilteredObject(string, 0);
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/me/arasple/mc/trchat/bstats/Metrics.java:
--------------------------------------------------------------------------------
1 | package me.arasple.mc.trchat.bstats;
2 |
3 | import io.izzel.taboolib.module.inject.TSchedule;
4 | import me.arasple.mc.trchat.TrChat;
5 |
6 | import java.text.DecimalFormat;
7 |
8 | /**
9 | * @author Arasple
10 | */
11 | public class Metrics {
12 |
13 | private static MetricsBukkit metrics;
14 | private static DecimalFormat doubleFormat = new DecimalFormat("#.#");
15 | private static int[] coutns = new int[]{0, 0};
16 |
17 | public static void increase(int index) {
18 | increase(index, 1);
19 | }
20 |
21 | public static void increase(int index, int value) {
22 | if (coutns[index] < Integer.MAX_VALUE) {
23 | coutns[index] += value;
24 | }
25 | }
26 |
27 | @TSchedule
28 | public static void init() {
29 | metrics = new MetricsBukkit(TrChat.getPlugin());
30 |
31 | // 聊天次数统计
32 | metrics.addCustomChart(new MetricsBukkit.SingleLineChart("chat_counts", () -> {
33 | int i = coutns[0];
34 | coutns[0] = 0;
35 | return i;
36 | }));
37 | // 敏感词过滤器启用统计
38 | metrics.addCustomChart(new MetricsBukkit.SingleLineChart("filter_counts", () -> {
39 | int i = coutns[1];
40 | coutns[1] = 0;
41 | return i;
42 | }));
43 | }
44 |
45 | public static MetricsBukkit getMetrics() {
46 | return metrics;
47 | }
48 |
49 |
50 | }
--------------------------------------------------------------------------------
/src/main/java/me/arasple/mc/trchat/bstats/MetricsBungee.java:
--------------------------------------------------------------------------------
1 | package me.arasple.mc.trchat.bstats;
2 |
3 | import com.google.gson.JsonArray;
4 | import com.google.gson.JsonObject;
5 | import net.md_5.bungee.api.plugin.Plugin;
6 | import net.md_5.bungee.config.Configuration;
7 | import net.md_5.bungee.config.ConfigurationProvider;
8 | import net.md_5.bungee.config.YamlConfiguration;
9 |
10 | import javax.net.ssl.HttpsURLConnection;
11 | import java.io.*;
12 | import java.lang.reflect.InvocationTargetException;
13 | import java.net.URL;
14 | import java.nio.charset.StandardCharsets;
15 | import java.nio.file.Path;
16 | import java.util.ArrayList;
17 | import java.util.List;
18 | import java.util.UUID;
19 | import java.util.concurrent.TimeUnit;
20 | import java.util.logging.Level;
21 | import java.util.zip.GZIPOutputStream;
22 |
23 | /**
24 | * bStats collects some data for plugin authors.
25 | * Check out https://bStats.org/ to learn more about bStats!
26 | */
27 | @SuppressWarnings({"WeakerAccess", "unused"})
28 | public class MetricsBungee {
29 |
30 | public static final int B_STATS_VERSION = 1;
31 | private static final String URL = "https://bStats.org/submitData/bungeecord";
32 | private static final List