Ban spammers in slackware_ru chat automatically

This commit is contained in:
eleksir
2025-05-10 00:44:31 +03:00
parent f97557868b
commit c24644b10e
2 changed files with 58 additions and 39 deletions

View File

@@ -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:

View File

@@ -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;