提问人:Madara's Ghost 提问时间:11/5/2011 更新时间:11/5/2011 访问量:228
套接字流、字节计数和计时器
Socket Streaming, Byte Count and Timers
问:
我正在用PHP为IRC机器人制作几个类。理想情况下,该机器人将是一个频道保护机器人,用于踢和禁止违规者。
现在,我对如何做大多数事情有了一个好主意(脏话匹配、全部大写等)。但最重要的是防洪。
我想看看用户是否在 3 秒内键入了 5 行文本,或者用户在 3 秒内输入了超过 220 字节的文本,机器人将采取行动。当然,这一切都是在套接字中接收的,我不是很擅长。
例子:
线路泛滥
[11:17:00] <user1> Hey!
[11:17:00] <user1> Hey!
[11:17:00] <user1> Hey!
[11:17:11] <user1> Hey!
[11:17:11] <user1> SPAAAAAACE!
*Line flood detected!*
字节泛洪
[11:17:00] <user1> Hey! this is a very long long text.
[11:17:00] <user1> and I pasted it from a file or something so that these lines all occur one after another with 0 time
[11:17:00] <user1> This should be considered a byte flood since it's so very looooooooooooooong.
*byte flood detected overall counted bytes in the last 3 seconds from user1 is too much*
所以问题来了:如何计算某个输入是否在 Y 秒内发生了 X 次,以及如何计算另一个特定输入是否在 Y 秒内发送了 X 字节(累积)?
我的代码在套接字方面与这里的代码相似
答:
1赞
hakre
11/5/2011
#1
如果要计算大小和时间的总和,首先需要存储要进行计算的相关数据。
例如,每次用户键入内容时:
$store[] = array('user' => $user, 'len' => strlen($data), 'time' = now());
为了保持示例简单,我使用了一个数组。如果您还想跟踪重复,您还需要存储输入的数据/和/或与用户上次输入的数据进行比较,看看它是否相同。
然后,您可以使用此数组来计算值并检查您要查找的内容。
您还可以在完成此操作后从该数组中删除所有超过一分钟左右的条目,以保持该列表较小。
评论
0赞
Madara's Ghost
11/5/2011
告诉我我是否在正确的方向上,使用 while 循环测试 Y 秒后,计算累积的“len”和总索引计数,然后采取适当的措施?
1赞
hakre
11/5/2011
当你有了数据结构(我们称之为积压工作)时,你可以用它做不同的事情。就像编写一个函数,将其作为参数传递,然后返回一些东西。喜欢。在该函数中,您循环,跳过除 ,检查时间是否大于,如果大于,则将长度添加到计数器(总和)。然后返回该总值。工作完成。对于其他检查,添加另一个函数。get_length_for_seconds($backlog, $user, $seconds = 5)
$backlog
$user
now()-$seconds
0赞
Madara's Ghost
11/5/2011
我明白了,谢谢。我会等待更多的答案(因为有一个答案已经撤回了),如果没有什么特别的事情发生,我会接受你的。干杯:)
上一个:响应式富编辑器预览
评论