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
|
||||
PluginEnabled ChanMsgToggle ChanMsgStatus ChanMsgEnabled GreetMsgToggle GreetMsgStatus
|
||||
GreetMsgEnabled GoodbyeMsgToggle GoodbyeMsgStatus GoodbyeMsgEnabled MuteByAdminToggle
|
||||
MuteByAdminStatus MuteByAdminEnabled MigrateSettingsToNewChatID IsCensored);
|
||||
MuteByAdminStatus MuteByAdminEnabled MigrateSettingsToNewChatID IsCensored GetSlackGreetRememberId
|
||||
SetSlackGreetRememberId);
|
||||
|
||||
my $c = LoadConf ();
|
||||
my $cachedir = $c->{cachedir};
|
||||
@@ -732,6 +733,43 @@ sub IsCensored {
|
||||
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;
|
||||
|
||||
# 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 BotLib::Admin qw (FortuneToggleList ChanMsgEnabled GreetMsgEnabled GoodbyeMsgEnabled
|
||||
MigrateSettingsToNewChatID IsCensored);
|
||||
MigrateSettingsToNewChatID IsCensored GetSlackGreetRememberId SetSlackGreetRememberId);
|
||||
use BotLib qw (Command);
|
||||
use BotLib::Conf qw (LoadConf);
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -224,50 +226,29 @@ sub __on_msg {
|
||||
|
||||
# Bots have non-0% tendency to appear with this kind of updates.
|
||||
if ($msg->can ('new_chat_member') && defined ($msg->new_chat_member)) {
|
||||
unless (GreetMsgEnabled ($chatid)) {
|
||||
# slackware_ru
|
||||
unless ($chatid == -1001332512695) {
|
||||
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;
|
||||
|
||||
my $m->{text} = $phrase;
|
||||
$m->{chat_id} = $chatid;
|
||||
$m->{disable_notification} = 1;
|
||||
$m->{parse_mode} = 'Markdown';
|
||||
# Can be racy, but hope for best.
|
||||
unless (SetSlackGreetRememberId($msg->new_chat_member->user->id)) {
|
||||
# if earlier we did not get new chat member event, it looks like we have spammer here. Ban it.
|
||||
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}) {
|
||||
$log->error ("Unable to call sendMessage BotAPI method: " . Dumper ($res));
|
||||
if ((ref ($result) eq 'JSON::PP::Boolean') && ($result == JSON::PP::true)) {
|
||||
return;
|
||||
} else {
|
||||
$log->error ("Unable to ban user: " . Dumper ($result));
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user