Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
9464355
first version
AzatF Jul 8, 2022
3db1733
clean readme
AzatF Jul 8, 2022
419a2c2
db add
AzatF Jul 8, 2022
8c1ec77
Makefile and Dockerfile added
insolare Jul 8, 2022
9ad3eda
Dockerfile cleanup
insolare Jul 8, 2022
4cf3154
Merge pull request #1 from AzatF/feat_BuildTools
AzatF Jul 8, 2022
f1976a5
add button to add moder group
AzatF Jul 9, 2022
1a9341b
button after choice remove
AzatF Jul 9, 2022
a4a3007
word database begin
AzatF Jul 9, 2022
21d8a05
conf
AzatF Jul 9, 2022
94df26d
readme, restruct fuctions
AzatF Jul 9, 2022
70adc36
maked button congratulation new user
AzatF Jul 11, 2022
678a9e0
---
AzatF Jul 11, 2022
d5c4836
data restructed
AzatF Jul 14, 2022
ec0dd1e
commands deleted
AzatF Jul 14, 2022
857bd1a
added rules
AzatF Jul 14, 2022
dbfe8f0
conf add, need remove number 2
AzatF Jul 14, 2022
905a040
time local fix
AzatF Jul 15, 2022
f8aa60a
fixed button functions
AzatF Jul 15, 2022
c1e0edd
readme
AzatF Jul 15, 2022
81c0ea0
users id refactor
AzatF Jul 15, 2022
e6ada37
main
AzatF Jul 15, 2022
cf27723
makefike
AzatF Jul 16, 2022
175b9fc
mkdir
AzatF Jul 16, 2022
5cdf159
main
AzatF Jul 17, 2022
faedacb
conf
AzatF Jul 17, 2022
030c1a0
check congrat
AzatF Jul 17, 2022
0312344
main
AzatF Jul 17, 2022
3224c09
dockerfile final version
AzatF Jul 20, 2022
09dc067
docker
AzatF Jul 20, 2022
f5025ff
readme + config
AzatF Jul 20, 2022
1985d36
readme
AzatF Jul 20, 2022
83d7017
readme
AzatF Jul 20, 2022
c1fc4de
readme
AzatF Jul 20, 2022
153e96a
readme
AzatF Jul 20, 2022
4e370f1
comand del
AzatF Jul 21, 2022
c68576a
docker image link added
AzatF Jul 21, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

FROM golang:1.18.3 as builder
LABEL stage=tgbotbuilder
WORKDIR /src

COPY go.mod .
COPY go.sum .
RUN go mod download

COPY . .

RUN make build

FROM alpine:latest as certs
LABEL stage=tgbotbuilder
RUN apk --update add ca-certificates

FROM scratch
COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder /app /app
ADD folders.tar.gz /



ENTRYPOINT [ "/app" ]
13 changes: 13 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.PHONY: default build image run

default: build

build:
CGO_ENABLED=1 GOOS=linux go build -o /app -a -ldflags '-linkmode external -extldflags "-static"' cmd/main.go

image:
docker build -t skillbot:latest .
docker image prune -f --filter label=stage=tgbotbuilder

run:
go run cmd/main.go
97 changes: 97 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,98 @@
# tg-bot-users 🤖

Телеграм бот написан на языке GoLang.
База данных построена на SQLite3

# Список функций:


1. Бот отслеживает вход юбилейных пользователей в группы. Оповещение приходит связанным группам модераторов.
Копия в админку. Возможность поздравить юбилейного пользователя ответным сообщением, есть только у админки.
Но и из любой группы модераторов можно вызвать список последних юбилейных пользователей и поздравить пользователя.
(Первое поздравление из админки сделано в целях исключения дублирования нажатия "поздравить" из
админки и связанной группы модераторов.)

2. При совпадении ID пользователя в списке юбилейных пользователей в админку приходит уведомление.
3. Список трех последних юбилейных пользователей можно вызвать из **меню администратора**.
4. Список всех юбилейных пользователей можно вызвать из **меню администратора**.
5. Список всех команд можно вызвать из **меню администратора**. Доступно прямое копирование команды нажатием на неё.
6. В меню встроена кнопка "Памятка модераторам", выводит текст в виде сообщения. Текст задается перед запуском в файле конфигурации.
7. Функция фильтрации содержания нецензурных слов в тесте сообщений в группах пользователей.
8. Функция пополнения списка нецензурных слов. Доступно в только в группах модераторов и админке.
9. Функция передачи ID и названия группы автоматическим сообщением в админку.
10. Реализовано несколько вариантов добавления групп модераторов:
1 - Запрос из любой группы с ботом командой "", запрос приходит в админку, далее принимается решение одобрить или нет.
2 - Примой командой с номером группы. Доступно из админки.
3 - При связывании групп модераторов и пользователей, если группа модераторов не найдена в списке доступных.
(функция добавления группы модераторов без связывания с группами пользователей реализована с целью дальнейшего расширения функционала бота.)
11. Функция просмотра всех групп модераторов и пользователей.
12. Функция фильтрации символов в словах сообщений. Сделано с целью предотвращения маскировки нецензурных слов в сообщениях.
Пополнить или изменить список символов можно в файле конфигурации.
13. На большинство административных сообщений действует автоматическая очистка.




# Список команд:

1. [x] **меню** _(Вызов только из групп модераторов и админки.)_
2. [x] **chatinfo** _(Вызов из любой группы, где есть бот администратор. Присылает сообщение с ID и названием группы в админку.)_
3. [x] **moder** _(Вызов из любой группы, где есть бот. Присылает запрос в админку на добавление группы в список
модераторов. Действует ограничение по времени 60 секунд.)_
4. [x] **add-moder-user-link** _(Вызов только из админки. Связывает группу модераторов и пользователей для
персонализации оповещений о новых пользователях и нецензурных слов в группе.)_
5. [x] **addmoderatorgroup + ID группы** _(Добавление группы модераторов по ID из админки.)_
6. [x] **Мат** + слово _(Слово будет добавлено в базу, работает только в группах администраторов.)_


# Конфигурация приложения:

### Запуск приложения локально: /etc/tgbot/.env

| ПАРАМЕТР: | ОПИСАНИЕ: |
|:-----------------------------:|:-----------------------------------------------------------------------------------------------:|
| TG-BOT-TOKEN | Токен для вашего бота, полученный от BotFather |
| MULTIPLICITY | Кратность выявления новых пользователей |
| TG-BOT-LOG-LEVEL | Уровень логирования приложения. `panic`, `fatal`, `error`, `warning`, `info`, `debug`, `trace` |
| MODERATORS-GROUP | ID группы админки |
| MSG-OF-BAD-WORDS-TO-USER-CHAT | Текст который будет выводиться в группу пользователей при обнаружении нецензурных слов |
| MSG-TO-CHAT-IF-NEW-USER | Текст приветствия в группу при вступлении в группу нового пользователя |
| MSG-MODERATOR-MEMBER | Текст памятка модераторам. Выводится при нажатии на кнопку `Памятка модераторам` |
| MSG-TRIM-SYMBOL | Список символов для удаления из строк при проверке слов в сообщениях |


Клонировать репозиторий, обновить пакеты командой `go mod tidy` , убедиться что все пакеты скачаны и установлены.
Запуск приложения из папки cmd - go run main.go

# Запуск в Докер-контейнере:

- Команда "make image" создает образ приложения.
---
- Вам нужно создать `volume` под вашу базу данных командой "docker create volume `tgbot_data`"
---
- При первом запуске контейнера вам нужно указать путь к вашей базе данных (`db/path`) и путь к файлу конфигурации, аргументами:
docker run -v `db/path`:/data -v `env-path`:/etc/tgbot skillbot:latest
---
- Последующие запуски этого контейнера (а так-же последующих с таким же адресом базы) `docker start name`, где `name` это имя контейнера либо его ID,
сохранят базу данных предыдущих сеансов работы контейнера.

### Примеры:
```
docker create volume tgbot_data
```
```
make image
```
```
docker run -v /home/user/tgbot_data/:/data -v /home/user/go-projects/telegram_bot_skb/etc/tgbot:/etc/tgbot skillbot:latest
```
```
docker stop name
```
```
docker start name
```

### Ссылка на образ:

- [Skillbot v1.0](https://hub.docker.com/repository/docker/azatf/skillbot)
90 changes: 90 additions & 0 deletions cmd/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package main

import (
"flag"
tgb "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"log"
"skbot/internal/callbackmsg"
"skbot/internal/chatmembers"
"skbot/internal/config"
"skbot/internal/functions"
"skbot/internal/textmsg"
"skbot/pkg/client/telegram"
"skbot/pkg/logging"
)

var cfgPath string

func init() {
flag.StringVar(&cfgPath, "config", "./etc/tgbot/.env", "config file path")
}

func main() {

log.Print("config initializing")
cfg := config.GetConfig(cfgPath)

log.Print("logger initializing")
logger := logging.GetLogger(cfg.AppConfig.LogLevel)

db, err := functions.NewFuncList(cfg, logger)
if err != nil {
logger.Fatal(err)
}

err = db.NewData()
if err != nil {
logger.Error(err)
}

updChan, bot, err := telegram.StartBotByChan(cfg, logger)
if err != nil {
logger.Fatal(err)
}

moderGroup, err := db.GetModeratorsGroup()
if err != nil {
logger.Error(err)
}

if len(moderGroup) == 0 {

groupInfo, _ := bot.Send(tgb.NewMessage(cfg.ModersGroupID.ModeratorsGroup, "test"))
_, _, err = db.AddModeratorsGroup(cfg.ModersGroupID.ModeratorsGroup, groupInfo.Chat.Title)
if err != nil {
logger.Info(err)
}
_, _ = bot.Send(tgb.NewDeleteMessage(groupInfo.Chat.ID, groupInfo.MessageID))

}

defer bot.StopReceivingUpdates()

for {

update := <-updChan

if update.Message != nil {

if update.Message.Text != "" {
// text messages operations
textmsg.WithTextQueryDo(update, bot, logger, cfg)

} else if update.Message.NewChatMembers != nil {

chatmembers.WithChatMembersDo(update, bot, logger, cfg)
}

} else if update.CallbackQuery != nil {

callbackmsg.WithCallBackDo(update, bot, logger, cfg)
// TODO inline help

} else if update.InlineQuery != nil {

query := update.InlineQuery.Query
logger.Printf("response from Inline query: %s", query)

}
}
}
13 changes: 13 additions & 0 deletions etc/tgbot/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
MULTIPLICITY=500

TG-BOT-TOKEN=(здесь ваш токен от бота, полученный от BotFather)
TG-BOT-LOG-LEVEL=(уровень логирования. По умолчанию trace.)

MODERATORS-GROUP=(здесь ID группы администраторов (админки).)

DB-FILE-PATH=./data

MSG-OF-BAD-WORDS-TO-USER-CHAT="Уважаемые коллеги, просим вас воздержаться от нецензурных выражений в %s. Сообщение удалено, надеемся на ваше понимание."
MSG-TO-CHAT-IF-NEW-USER="🎉 Поздравляю, %s! Как же удачно вы попали в нужное время и в нужное место! Вы %d участник комьюнити. Вас ждут плюшки и печеньки!🎉"
MSG-MODERATOR-MEMBER="В этой памятке можно составить текст перед запуском бота, как напоминание об основных правилах, либо что-то еще на усмотрение администратора."
MSG-TRIM-SYMBOL="([]{}*).,!?;:"
Binary file added folders.tar.gz
Binary file not shown.
18 changes: 18 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module skbot

go 1.18

require (
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
github.com/ilyakaznacheev/cleanenv v1.3.0
github.com/mattn/go-sqlite3 v1.14.14
github.com/sirupsen/logrus v1.8.1
)

require (
github.com/BurntSushi/toml v1.1.0 // indirect
github.com/joho/godotenv v1.4.0 // indirect
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3 // indirect
)
26 changes: 26 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc=
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8=
github.com/ilyakaznacheev/cleanenv v1.3.0 h1:RapuLclPPUbmdd5Bi5UXScwMEZA6+ZNLU5OW9itPjj0=
github.com/ilyakaznacheev/cleanenv v1.3.0/go.mod h1:i0owW+HDxeGKE0/JPREJOdSCPIyOnmh6C0xhWAkF/xA=
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw=
github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3 h1:slmdOY3vp8a7KQbHkL+FLbvbkgMqmXojpFUO/jENuqQ=
olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3/go.mod h1:oVgVk4OWVDi43qWBEyGhXgYxt7+ED4iYNpTngSLX2Iw=
Loading