Coder Social home page Coder Social logo

ru-bot's Introduction

ru_bot

codecov

Installation

For better development conditions, you need to install docker and docker-compose

Also, we advise you to install all devdependencies locally (linters, etc):

npm install

Don't forget to create .env (from .env.example) and src/.chatlist.json (from src/.chalist.example.json).

When you made all steps above, run

docker-compose pull
docker-compose up -d postgres
docker-compose up --build app

Your application will automatically restart with nodemon after code changes (in src directory).

Create commits through commitizen:

npm install --global commitizen

# commit
git cz

Use next commands to manipulate db schema:

# To run all migrations
npm run migrate

# To rollback latest migration
npm run rollback

ru-bot's People

Contributors

atassis avatar dependabot[bot] avatar sergeysova avatar syabro avatar viiprogrammer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ru-bot's Issues

Отображение причины бана

При форварде сообщения пользователя в личку боту, нужно получить ответ в виде сообщения из канала с логами о причине получения бана

Приватный канал для модераторов

Часто к модераторам обращаются пользователи с просьбой разбанить пользователя в каких-либо чатах. Появляется вопрос — за что пользователь был забанен? Отдельный канал позволил бы осуществлять быстрый поиск информации для принятия решения о снятии блокировки с пользователя.

Информация в канале может вестись в следующей форме:

@username забанен [за ?причина] модератором @username в @chat <data>

<сообщение, за которое пользователь получил бан>

Удаление стикеров от юзеров

Опциональная фича. Бот по тихому вырезает стикеры от юзеров и запрещает на уровне телеграма присылать стикеры конкретному юзеру.

Интерфейс "Спам"

При постулении команды !cпам [?пользователь] (или при ответе на сообщение) данный пользователь заносится в черные списки всех подконтрольных чатов. Его сообщения за последние 48/10/5 часов (?) удаляются со всех чатов, так же удаляется и сообщение модератора. Информация заносится в приватный канал.

Пункты для обсуждения:

  • Является ли бан безаппеляционным?
  • Если нет, то в течении какого срока нельзя обжаловать данное действие?
  • Что, если пользователь был ошибочно помечен как спамер?
  • Определить параметры очереди на удаление сообщений

Едина точка входа

Бот становится единой точкой входа в сообщества. Пользователь пишет ему список базвордов, а бот сам добавляет в пользователя в чаты где находит такие базворды в описание

Интерфейс "Бан пользователя"

При ответе на сообщение пользователя и сообщении !бан [причина] происходит блокировка пользователя в чате, где была вызвана команда. При этом в базе данных создается отметка, где указывается КЕМ, КОГО, ПРИЧИНА и СООБЩЕНИЕ за которое пользователь был добавлен в черный список, так же эта информация публикуется в закрытом канале для модераторов, чтобы по просьбе данного пользователя можно было бы понимать, стоит ли разблокировать данного пользователя.

Приветствие бота

Ответ на команду /start в личке

Для админов

Привет Name Lastname (@username) #98273487634857.

Ты админ в 4 группах:
@react_js (инфо, удал.сообщ., бан, пин)
@nodejs_ru (удал.сообщ., бан)
@macOS_ru (всё)
@foobar_ru (удал.сообщ., бан, пин)

Для юзеров

Привет Name Lastname (@username) #98273487634857.

Ты забанен в 1 чате:
@react_js до 12.02.2024, причина: флуд

Ты НЕ в спам листе

Убрать список чатов из лога

  • Убрать список чатов в которых забанен спамер. Оставить только тот, в котором была вызвана команда бота
  • Показывать количество чатов в которых забанен (От Сенатор в React + 32 чатов)
  • Показать список чатов в которых не удалось забанить спамера (например отобрали права у бота)

Запрос на бан от обычных пользователей

Пользователям предлагается команда !voteban <причина> или !вбан <причина>, которая должна быть вызвана на сообщении пользователя или же с меншеном в тексте.

При вызове команды (например !voteban @sergeysova снова агрится) в приватный канал отправляется сообщение примерного содержания и меншном админов чата:

Max Syabro (@syabro) #123123123 предложил заблокировать 🦉 (@sergeysova) #123123123 в чате React.js (@react_js) #-123123123

`@sergeysova снова аргится`

@zerobias @defaultvoice @pauline_nemchak @DenisIzmaylov @anotheradmin

К сообщению добавляются кнопки:
[ Перейти ] — ссылка для переходу к сообщению в чате
[ RO 1 час ] [ RO 6 часов ] [ RO 1 день ] — для выдачи пользователю ReadOnly на время
[ Заблокировать ] — пользователь блокируется в чате

Надо придумать, что делать если !voteban был вызван на админах

Тестирование

  • Add travis-ci.org
  • Add codecov
  • lib/channel
  • lib/chat
  • lib/extended-context
  • lib/hammer
  • lib/runtime
  • lib/string
  • lib/telegram-group
  • lib/text
  • middlewares/admin-required
  • middlewares/allowed-chat
  • features/bot-participation
  • features/get-id
  • features/private-greetings
  • features/spam-hammer

Переработать логирование

Нужно переработать логирование бота. На данный момент он пишет в вывод абсолютно каждое действие- запись в базу, в эластик и прочее. Необходимо обдумать, что и куда выводить, а также внедрить в работу с ошибками sentry.

Стикеры от бота

Можно добавить боту возможность реагировать на события в чате (опционально).

Например, в случае если с помощью бота забанили спамера, бот присылает в чат стикер с текстом/картинкой: Ахтыж спамер е**ный

Интерфейс "Спам" для обычных юзеров

Как предложил @syabro в #2, обычные юзеры должны иметь команду !спам, /spam, при которой отправляется нотификация админам (в приватный канал?).

  • Команда должна сразу же вытираться с ответом ("Репорт отправлен")
  • Нужно подчищать все ложные вызовы команды /spam
  • Нужно подчищать сообщения "Репорт отправлен" (сохранять в базе?)

Общий список админов для всех групп

Вести в базе список админов.

Менеджмент cписка, один из:

  • обновлять исходя из существующих админов всех групп (обновлять периодически и/или по event, плюс ручное обновление)
  • поддерживать список полностью руками

При входе в чат пользователя из списка админов, давать ему права админа автоматически.

В случае удаления юзера из админлиста, убивать его во всех группах.

В случае бана юзера:

  • ✅ не реагировать (админы под защитой)
  • банить и удалять из спамлиста (админы подвержены)

Фикс обрезания названия чата

Как идея: если название чата меняется на префикс, то скразу откатывать обратно. Или добавить команду для смены названия, а все ручные изменения откатывать

Propose to move to the English for communications

Despite, this SW has the ru key in its name, anyway I should force you guys to speak English here.
I understand everyone is lazy like me, but GitHub has something like a tradition, and as for more it should be really useful for any programmer, to practice English a little. (for free) ))

Веб-интерфейс

  • Фильтрация по логам
  • Просмотр и редактирование черных списков

Управление ботом

Следующие команды необходимы для работы бота:

  • Обновление списка привилегированных пользователей #11
  • Обновление настроек чатов (в случае если были обновлены JSON настройки) #4
  • Некоторый интерфейс для снятия ограничений с пользователя

Реакция бота на нового юзера

При входе юзера в чат проверять его наличие в черном списке.

Если он там есть, сразу же банить и удалять его сообщения, если есть

Настройки чатов

Для каждого чата, где был добавлен бот, необходимо реализовать возможность конфигурирования бота.

Возможные варианты:

  • В виде настроек в личной переписке с ботом
  • В виде задания через JSON (на сервере)

ReadOnly для новых юзеров

Функциональность должна быть опциональной, переключаться в настройках чата.

При входе юзеру сразу же дается РО на промежуток времени (10 минут, 1 час, 3 часа, 1 день). Он может получить возможность писать досрочно, если перейдет по спец ссылке в ЛС с ботом.

Есть смысл указать ссылку в правилах чата.

Команда на предупреждение перед !ро

Хотелось бы, чтобы можно было выдавать предупреждение перед тем, как банить или давать РО. Это бы сэкономило время на предупреждения + можно хранить инфу о тех, кому предупреждения выдают и с этой инфо в будущем работать.

Юзер кейс

  1. пользователь нехорошо себя ведет но до РО/бана еще рано.
  2. Администратор выдает предупреждение реплаем, через команду.
  3. Бот реплаит на сообщение пользователя и говорит, что он скоро получит ро (опционально — удаляет сообщение пользователя).
  4. Пользователь все понимает и больше не шалит.

Примеры команды:
!cигнал
!!
!предупреждение

Глобальный бан

Помимо !бан в текущем чате нужна команда для бана во всех чатах.

может быть !банвезде или аналог.

Выпилить i18n

Заменить i18n более легким вариантом.

В нашем боте не нужна интернационализация, но было бы неплохо хранить все тексты в одном месте.

Можно хранить тексты в таком виде

module.exports = {
  common: {
    greetings: ({ user }) => `Привет, ${user.first_name}!`,
    help: () => `В нашем чате есть правила.
Найти их можно по ссылке github.com/telegram-ru/rules`,
  },
  action: {
    ban: () => `Забанить`,
    span: () => `СПАМ`,
  },
}

А использовать проще простого

const text = require('../texts')


ctx.reply(text.common.greetings({ user: ctx.from }))

Можно ввести функцию random() для вывода случайного сообщения из списка

function random(variants) {
  const count = variants.length
  
  return (object) => variants[Math.floor(Math.random() * count)](object)
}

// Usage

module.exports = {
  ban: {
    adminBanAdmin: random([
      ({ active, passive }) => `Хэй, ${fullName(passive)}! Тебя тут ${fullName(active)} забанить хочет!`,
      ({ active }) => `А вот хер, ${active.first_name}, так дела не делаются!`,
      () => `Но но но!`,
    ])
  },
}


function fullName({ id, first_name, last_name, username }) {
  return [
    first_name,
    last_name,
    username && `(${username})`,
  ]
  .filter(e => !!e)
  .join(' ')
}

Рефакторинг удаления спама

Новый флоу:

  • 1 Админ кидает !спам на сообщение
  • 2 Бот банит в текущем чате
  • 3 Бот пересылает спам сообщение в приватный канал
  • 4 Бот удаляет сообщения в текущем чате
  • 5 Бот кидает в лог сообщение с информацией об удалениях и текст "Удаляем…"
  • 6 Бот удаляет сообщение !спам
  • 7 Бот банит спамера в остальных чатах
  • 8 Бот удаляет сообщения спамера в остальных чатах
  • 9 Бот изменяет сообщение в логе на обычное о бане

Команда !статус

При отправке в:

  • ЛС — игнор
  • обслуживаемый чат — отвечает подтверждением (удаляет сообщение с командой)
  • необслуживаемый чат — игнор

Интерфейс "Мета"

При ответе на сообщение пользователя сообщением !мета, бот должен удалить это сообщение и ответить на оригинальное текстом, вроде:

Пожалуйста, не задавайте мета-вопросов в чате!
Мета-вопрос - это вопрос, который подразумевает другие вопросы.
http://nometa.xyz/

Работа с админами и чатами из БД

Предлагаю переработать работу с вышеуказанными сущностями- помечать пользователей как имеющих права администратора или нет, а также добавить action в самого бота, с помощью которого администраторы смогут добавить чат в список администрируемых (вместо .chatlist.json)
Перед выполнением данного действия, например, проверять, является ли юзер админом, находится ли бот в чате и имеет ли нужные права

Удаление лишних пользователей из канала с логами

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

Уведомления при вызове /report

Некоторые пользователи реагируют на спам быстрее нас, и при этом используют /report. Предлагаю задействовать каким-либо образом данное действие

Статистика пользователя

Добавить в логах к событию бана пользователя доп. информацию:

  • Количество банов которые пользователь получал в чате
  • Срок на который был забанен пользователь в этом событии

Чем полезно:

  • Понять на сколько вредного для сообщества пользователя забанил
  • Возможность быстро понять рецидивист ли сейчас несет деструктивную обстановку в чате, посмотрев в логах историю по нему

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.