Ban spammers in slackware_ru chat automatically
This commit is contained in:
@@ -19,7 +19,8 @@ our @EXPORT_OK = qw (@ForbiddenMessageTypes @PluginList GetForbiddenTypes AddFor
|
|||||||
ListForbidden FortuneToggle FortuneToggleList FortuneStatus PluginToggle PluginStatus
|
ListForbidden FortuneToggle FortuneToggleList FortuneStatus PluginToggle PluginStatus
|
||||||
PluginEnabled ChanMsgToggle ChanMsgStatus ChanMsgEnabled GreetMsgToggle GreetMsgStatus
|
PluginEnabled ChanMsgToggle ChanMsgStatus ChanMsgEnabled GreetMsgToggle GreetMsgStatus
|
||||||
GreetMsgEnabled GoodbyeMsgToggle GoodbyeMsgStatus GoodbyeMsgEnabled MuteByAdminToggle
|
GreetMsgEnabled GoodbyeMsgToggle GoodbyeMsgStatus GoodbyeMsgEnabled MuteByAdminToggle
|
||||||
MuteByAdminStatus MuteByAdminEnabled MigrateSettingsToNewChatID IsCensored);
|
MuteByAdminStatus MuteByAdminEnabled MigrateSettingsToNewChatID IsCensored GetSlackGreetRememberId
|
||||||
|
SetSlackGreetRememberId);
|
||||||
|
|
||||||
my $c = LoadConf ();
|
my $c = LoadConf ();
|
||||||
my $cachedir = $c->{cachedir};
|
my $cachedir = $c->{cachedir};
|
||||||
@@ -732,6 +733,43 @@ sub IsCensored {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub GetSlackGreetRememberId ($) {
|
||||||
|
my $userid = shift;
|
||||||
|
|
||||||
|
my $cache = CHI->new (
|
||||||
|
driver => 'BerkeleyDB',
|
||||||
|
root_dir => $cachedir,
|
||||||
|
namespace => __PACKAGE__ . '_' . 'slack_greet_remember_id',
|
||||||
|
);
|
||||||
|
|
||||||
|
my $state = $cache->get ($userid);
|
||||||
|
|
||||||
|
if (defined $state) {
|
||||||
|
if ($state) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub SetSlackGreetRememberId ($) {
|
||||||
|
my $userid = shift;
|
||||||
|
|
||||||
|
my $cache = CHI->new (
|
||||||
|
driver => 'BerkeleyDB',
|
||||||
|
root_dir => $cachedir,
|
||||||
|
namespace => __PACKAGE__ . '_' . 'slack_greet_remember_id',
|
||||||
|
);
|
||||||
|
|
||||||
|
$cache->set ($userid, 1, 'never');
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
# vim: set ft=perl noet ai ts=4 sw=4 sts=4:
|
# vim: set ft=perl noet ai ts=4 sw=4 sts=4:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ use Math::Random::Secure qw (irand);
|
|||||||
use Mojo::Base 'Teapot::Bot::Brain';
|
use Mojo::Base 'Teapot::Bot::Brain';
|
||||||
|
|
||||||
use BotLib::Admin qw (FortuneToggleList ChanMsgEnabled GreetMsgEnabled GoodbyeMsgEnabled
|
use BotLib::Admin qw (FortuneToggleList ChanMsgEnabled GreetMsgEnabled GoodbyeMsgEnabled
|
||||||
MigrateSettingsToNewChatID IsCensored);
|
MigrateSettingsToNewChatID IsCensored GetSlackGreetRememberId SetSlackGreetRememberId);
|
||||||
use BotLib qw (Command);
|
use BotLib qw (Command);
|
||||||
use BotLib::Conf qw (LoadConf);
|
use BotLib::Conf qw (LoadConf);
|
||||||
use BotLib::Util qw (trim fmatch Highlight RandomCommonPhrase);
|
use BotLib::Util qw (trim fmatch Highlight RandomCommonPhrase);
|
||||||
@@ -188,6 +188,8 @@ sub __on_msg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Remember user id, to check it later, in next event.
|
||||||
|
SetSlackGreetRememberId ($member->id);
|
||||||
push @members, sprintf '[%s](tg://user?id=%s)', $member_str, $member->id;
|
push @members, sprintf '[%s](tg://user?id=%s)', $member_str, $member->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,50 +226,29 @@ sub __on_msg {
|
|||||||
|
|
||||||
# Bots have non-0% tendency to appear with this kind of updates.
|
# Bots have non-0% tendency to appear with this kind of updates.
|
||||||
if ($msg->can ('new_chat_member') && defined ($msg->new_chat_member)) {
|
if ($msg->can ('new_chat_member') && defined ($msg->new_chat_member)) {
|
||||||
unless (GreetMsgEnabled ($chatid)) {
|
# slackware_ru
|
||||||
|
unless ($chatid == -1001332512695) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $member_str = '';
|
|
||||||
|
|
||||||
# Избегаем именования по пробельному символу
|
|
||||||
if ($msg->new_chat_member->user->can ('first_name') && defined ($msg->new_chat_member->user->first_name) && $msg->new_chat_member->user->first_name !~ /^\s+$/ui) {
|
|
||||||
$member_str .= $msg->new_chat_member->user->first_name;
|
|
||||||
|
|
||||||
if ($msg->new_chat_member->user->can ('last_name') && defined ($msg->new_chat_member->user->last_name) && $msg->new_chat_member->user->last_name !~ /^\s+$/ui) {
|
|
||||||
$member_str .= ' ' . $msg->new_chat_member->user->last_name;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($msg->new_chat_member->user->can ('last_name') && defined ($msg->new_chat_member->user->last_name) && $msg->new_chat_member->user->last_name !~ /^\s+$/ui) {
|
|
||||||
$member_str .= ' ' . $msg->new_chat_member->user->last_name;
|
|
||||||
# Username - это у нас валидная строка из только английских символов
|
|
||||||
} elsif ($msg->new_chat_member->user->can ('username') && defined ($msg->new_chat_member->user->username)) {
|
|
||||||
$member_str .= '@' . $msg->new_chat_member->user->username;
|
|
||||||
# Если у юзера нету подходящих имени, фамилии или username, будем пользовать его id
|
|
||||||
} else {
|
|
||||||
$member_str .= $msg->new_chat_member->user->id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
my $member = sprintf '[%s](tg://user?id=%s)', $member_str, $msg->new_chat_member->user->id;
|
|
||||||
|
|
||||||
$phrase = sprintf (
|
|
||||||
'%s, %s. Представьтес, пожалуйста, и расскажите, что вас сюда привело.',
|
|
||||||
$introduce_greet[irand ($#introduce_greet + 1)],
|
|
||||||
$member,
|
|
||||||
);
|
|
||||||
|
|
||||||
sleep 2;
|
sleep 2;
|
||||||
|
|
||||||
my $m->{text} = $phrase;
|
# Can be racy, but hope for best.
|
||||||
$m->{chat_id} = $chatid;
|
unless (SetSlackGreetRememberId($msg->new_chat_member->user->id)) {
|
||||||
$m->{disable_notification} = 1;
|
# if earlier we did not get new chat member event, it looks like we have spammer here. Ban it.
|
||||||
$m->{parse_mode} = 'Markdown';
|
my $send_args = undef;
|
||||||
|
$send_args->{chat_id} = 0 + $chatid;
|
||||||
|
$send_args->{user_id} = 0 + $msg->new_chat_member->user->id;
|
||||||
|
# I think formal ban for 10 seconds will be enough for start.
|
||||||
|
$send_args->{until_date} = 10 + time ();
|
||||||
|
|
||||||
my $res = $main::TGM->sendMessage ($m);
|
my $result = $self->banChatMember ($send_args);
|
||||||
|
|
||||||
if ($res->{error}) {
|
if ((ref ($result) eq 'JSON::PP::Boolean') && ($result == JSON::PP::true)) {
|
||||||
$log->error ("Unable to call sendMessage BotAPI method: " . Dumper ($res));
|
return;
|
||||||
|
} else {
|
||||||
|
$log->error ("Unable to ban user: " . Dumper ($result));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user