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

View File

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