标题: [安全][上古之石]AntiRepeat —— 高级反刷屏|你是复读机么?[全版本]
本帖最后由 1582952890 于 2017-9-17 11:28 编辑
本插件及介绍严禁任何人转载到任何地方
此插件没有频率限制,只有禁止重复同一语句,有效禁止打广告,建议跟其他反刷屏(频率限制)与反脏话(关键字屏蔽)插件配合。设计的不好不周到也偷懒没加配置文件(因为当时没打算发布,嫌麻烦就没加可配置内容
与其他插件不同之处:
1、相似度检测。相似度算法来自
http://my.oschina.net/BreathL/blog/42477
2、统计玩家说的最后10句话。玩家说话时,插件跟前10句比较,如果相似度大于85%并重复超过2次,则判定为重复刷屏。
3、相似度比较只检测中文。所以在后面打“aaa”一类的方法来绕开检测就失效咯。
(只检测上一句话很容易绕过,用两句话分开刷屏就好了,很简单很方便,mc也有聊天历史记录功能;但要同时按顺序发布10句话可就233333了
指令无,权限OP可bypass,配置文件无,是被写死在代码里的。默认属性如下:
1、判定为刷屏时,禁止这句话的发布,并提示玩家 "§c你是复读机么?"
2、指令是算在聊天内的,除了 /spawn 指令不拦截。
3、只记录玩家最后说的10句话。
4、相似度大于85%则判定为一样。
5、重复2句话后判定为刷屏,按1步骤操作
感觉写完这些发现语言表达能力-max了似乎连我自己也看不懂=A=就这样吧。
开源
- /*
- * Copyright 2016 andylizi.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package net.andylizi.antirepeat;
- import java.util.*;
- import java.util.concurrent.ConcurrentHashMap;
- import java.util.concurrent.ConcurrentMap;
- import java.util.function.Predicate;
- import org.bukkit.Bukkit;
- import org.bukkit.entity.Player;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.player.AsyncPlayerChatEvent;
- import org.bukkit.event.player.PlayerCommandPreprocessEvent;
- import org.bukkit.event.player.PlayerQuitEvent;
- import org.bukkit.plugin.java.JavaPlugin;
- import org.bukkit.scheduler.BukkitRunnable;
- /**
- * @author andylizi
- */
- public class AntiRepeat extends JavaPlugin implements Listener{
- private final ConcurrentMap<UUID, LinkedList<String>> lastChat = new ConcurrentHashMap<>();
- @Override
- public void onEnable() {
- Bukkit.getPluginManager().registerEvents(this, this);
- new BukkitRunnable() {
- @Override
- public void run() {
- lastChat.clear();
- }
- }.runTaskTimerAsynchronously(this, 0L, 20 * 60L);
- }
-
- @EventHandler(ignoreCancelled = true)
- public void onChat(AsyncPlayerChatEvent event){
- if(handle(event.getPlayer(), event.getMessage().toLowerCase()))
- event.setCancelled(true);
- }
-
- @EventHandler(ignoreCancelled = true)
- public void onCommand(PlayerCommandPreprocessEvent event){
- if(handle(event.getPlayer(), event.getMessage().toLowerCase()))
- event.setCancelled(true);
- }
-
- @EventHandler
- public void onQuit(PlayerQuitEvent event){
- lastChat.remove(event.getPlayer().getUniqueId());
- }
-
- public boolean handle(Player player, String msg){
- if(player.isOp())
- return false;
- if(!CosineSimilarAlgorithm.containsChinese(msg))
- return false;
- UUID uid = player.getUniqueId();
- LinkedList<String> last = lastChat.get(uid);
- if(last == null){
- last = new LinkedList<>();
- last.addFirst(msg);
- lastChat.put(uid, last);
- return false;
- }
- if(contains(last, msg, 0.85) > 1){
- player.sendMessage("§c你是复读机么?");
- return true;
- }
- last.addFirst(msg);
- while(last.size() > 10)
- last.pollLast();
- lastChat.put(uid, last);
- return false;
- }
-
- public static int contains(Collection<String> list, String str, double threshold){
- return count(list, s -> CosineSimilarAlgorithm.getSimilarity(str, s) > threshold);
- }
-
- public static <T> int count(Collection<T> collection, Predicate<T> predicate){
- return (int) collection.stream()
- .filter(predicate)
- .count();
- }
- }
复制代码 |
协议Apache 2.0,这只是主类(由于有lambda,jd-gui似乎无法反编译),CosineSimilarAlgorithm就是来自这篇
blog的算法(自己修改过一些地方),欢迎各种修改来符合自己服务器的需求但
请注明原作者,勿抹掉版权信息。
本插件只支持Java8或以上因为使用了lambda表达式
表示一用lambda就停不下来了,以后写插件就都用Java8了23333现在时代进步了嘛,不跟上也是不行滴。
如果提示“Unsupported major.minor version 52.0”错误,则代表Java版本不足Java8(52.0),请升级你的Java!
下载
AntiRepeat.jar
(5.78 KB, 下载次数: 1117)
更新: v2.1修复了一个。。严重的。。问题?
哦对了。。还差一个。。图片?
本插件及介绍严禁任何人转载到任何地方