Очень быстро у администратора DC++ хаба встает проблема фильтрации сообщений в чате. Чаще всего это связано с отдельно взятыми представителями примато-подобных, которые нарочито общаются исключительно ненормативной лексикой, при этом хамят и оскорбляют остальных участников чата. Вторая причина - постоянный флуд ссылками на свои домашние хабы.

Для решения данной проблемы можно использовать разные способы. Есть масса ботов и скриптов, которые решают с разной степенью успешности такие вопросы. В данной же статье мы рассмотрим, как можно написать простой плагин для фильтрации сообщений чата.

Все что делает данный плагин - читает сообщения главного чата, сравнивает строки с имеющимися шаблонами - и заменяет найденные "нехорошие" сообщения произвольными фразами.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef CPCL_H
#define CPCL_H
 
#include <cvhplugin.h>
#include <cconndc.h>
 
using namespace nDirectConnect;
using namespace nDirectConnect::nPlugin;
 
class cpiCl : public cVHPlugin
{
public:
        cpiCl();
        virtual ~cpiCl();
        virtual void OnLoad(cServerDC* server);
 
        virtual bool RegisterAll();
        virtual bool OnParsedMsgChat(cConnDC * conn, cMessageDC *);
};
 
#endif
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
#include <iostream>
#include <fstream>
#include <time.h>
 
#include <algorithm>
#include <cctype>
#include <string>
 
#include "config.h"
#include "filter.h"
 
cpiCl::cpiCl()
{
        mName = "chatfilter";
        mVersion = "1.0.0";
};
 
void cpiCl::OnLoad(cServerDC* server)
{
        cVHPlugin::OnLoad(server);
};
 
cpiCl::~cpiCl()
{
};
 
bool cpiCl::RegisterAll()
{
        RegisterCallBack("VH_OnParsedMsgChat");
};
 
bool cpiCl::OnParsedMsgChat(cConnDC * conn, cMessageDC *msg)
{
        string &message = msg->ChunkString(eCH_CH_MSG);
 
        string tmpstr = message;
        std::transform(tmpstr.begin(), tmpstr.end(), tmpstr.begin(), (int(*)(int)) std::tolower);
 
        string::size_type loc = tmpstr.find("матюк",0);
        if (loc != string::npos) message = "йа афца!!!";
        msg->ApplyChunk(eCH_CH_MSG);
 
        return true;
};
 
REGISTER_PLUGIN(cpiCl);

 

Компилируем, включаем через команду !plugin - и наслаждаемся работой. Теперь если кто-либо в главном окне чата напишет слово "матюк" (или оно просто будет присутствовать в предложении), то вместо сообщения все увидят фразу "йа афца!!!".

Плагин простой. Но эффективный. Дальнейшие улучшения можно развить, например, в работу с MySQL для гибкого конфигурирования.