Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
de5bd45
initial commit
AlekseiKoniaev Jul 5, 2022
dc19409
created updates handlers frame, was performed minor changes of model
AlekseiKoniaev Jul 7, 2022
a94b752
clear log
Jul 7, 2022
0ce78d6
created new services, refactored application frame, made minor change…
AlekseiKoniaev Jul 8, 2022
5378ce8
add notification logic (not finished)
AlekseiKoniaev Jul 8, 2022
b2838c1
added working properties' configuration (group properties)
AlekseiKoniaev Jul 9, 2022
6a10e1f
refactored application frame, refactored model
AlekseiKoniaev Jul 10, 2022
ce8174e
create default properties and class Config
Jul 11, 2022
3acd82e
edit prop
Jul 11, 2022
8c0c750
edit prop.rev2
Jul 11, 2022
82c0793
edit prop.rev3
Jul 11, 2022
6169d99
edit prop.rev4
Jul 11, 2022
1ff3839
edit prop.rev5.0
Jul 11, 2022
c5f184b
added callback processing
AlekseiKoniaev Jul 11, 2022
d4ea6ba
Small refactoring
Jul 11, 2022
f779b74
Merge pull request #1 from nokerokuta/maxBranch
nokerokuta Jul 11, 2022
c2aa8cd
Merge branch 'master' into alexBranch
Jul 11, 2022
ba61780
added luckyList command logic
AlekseiKoniaev Jul 11, 2022
59b3398
Small refactoring
Jul 11, 2022
6aab914
Merge remote-tracking branch 'origin/alexBranch' into alexBranch
Jul 12, 2022
862bae5
Small refactoring =)
Jul 12, 2022
d1958f7
variables
Jul 12, 2022
5b222de
some developing
Jul 12, 2022
3a5a28c
Application rethinking, change architecture, refactoring, renaming
Jul 13, 2022
dfa0257
Merge pull request #2 from nokerokuta/alexBranch
nokerokuta Jul 13, 2022
ab4e545
CallbackData entity remove.
Jul 15, 2022
7d13d81
need help with "update" after merge
Jul 16, 2022
1d8c928
repear"update" after merge
Jul 16, 2022
6fec852
done addModerChat
Jul 17, 2022
287bf1e
need help bindUserChatToModer
Jul 17, 2022
112c1ba
need help bindUserChatToModer now
Jul 17, 2022
8c1c4f2
added command handler. Project not start!
AlekseiKoniaev Jul 17, 2022
1079479
done all add
Jul 17, 2022
d75664f
done delete user & moder chat. need help unbind
Jul 17, 2022
1698ccd
added class Template, added creation of notification text for joinAle…
AlekseiKoniaev Jul 17, 2022
1e49a73
need help unbind(deleteChatUser)
Jul 17, 2022
b78f65e
done add all,bind,unbind
Jul 17, 2022
aafc49d
commit dor Pavel
Jul 17, 2022
be6711c
added logging
AlekseiKoniaev Jul 18, 2022
3ebae06
Refactoring
Jul 18, 2022
bc5bd32
Merge branch 'master' into maxBranch
Jul 18, 2022
e001d06
Refactoring
Jul 19, 2022
845c9ad
Refactoring+
Jul 19, 2022
6f49a22
First test
Jul 19, 2022
ad284db
First test
Jul 19, 2022
4d3425b
README
Jul 20, 2022
e11e3f8
fix config settings, added application-test.yml, added Dockerfile and…
AlekseiKoniaev Jul 20, 2022
dccdc29
added chooseLucky command. Need refactoring!
AlekseiKoniaev Jul 20, 2022
553a963
added delete user chat and moderator chat, added new command "/curren…
AlekseiKoniaev Jul 21, 2022
284087d
+ luckyList
Jul 21, 2022
2cf13d5
Merge branch 'pavelBranch'
Jul 21, 2022
209ec32
update readme and docker-compose
AlekseiKoniaev Jul 21, 2022
ed49b7f
+ pre-final
Jul 21, 2022
84738a4
+ final
Jul 21, 2022
ac93703
Update pom.xml
nokerokuta Jul 21, 2022
8cdcf97
Merge branch 'master' into alexBranch
Jul 21, 2022
0ba2931
Merge branch 'master' into alexBranch
Jul 21, 2022
4d59b63
minor README message example addon
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
4 changes: 4 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.git
.idea
.mvn
Dockerfile
2 changes: 2 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
BOT_USER_NAME=GroupControlSkillboxBot
BOT_TOKEN=5566628073:AAHyZTYOh62Fb7_zVGNmHMqzwJUQtBvGWuc
33 changes: 33 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/
Binary file added .mvn/wrapper/maven-wrapper.jar
Binary file not shown.
18 changes: 18 additions & 0 deletions .mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar
4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM openjdk:17-alpine
COPY target/tg-bot-users-0.0.1-SNAPSHOT.jar tg-bot-users.jar
COPY application-bot.yml .
CMD java -jar tg-bot-users.jar
137 changes: 137 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,138 @@
# tg-bot-users 🤖

---
## Общие сведения
Приложение является телеграм ботом


Основные функции:
* Бот отслеживает вступление в группу новых пользователей.
* В случае юбилейного вступления пользователя, присылает уведомление в группу модераторов для принятия решения о поздравлении.
* При нажатии кнопки "Поздравить" приходит автоматическое поздравление вступившего пользователя.
* При нажатии кнопки "Отклонить" поздравления не происходит.


Дополнительные функции:
* Помимо самого юбилейного вступления, отслеживается несколько последующих - для ситуаций, если юбилейным оказался бот или модератор. Уведомление присылается на каждое подобное вступление, если решение о поздравлении ещё не было принято.
* Модератор может запросить у бота список всех юбилейных вступлений. Если в юбилейном списке есть ожидающие поздравления, то модератор может принять решение, пользуясь полученным списком. При этом раннее отклоненные решения могут быть изменены.


Менять настройки групп могут только администраторы.

---
## Запуск
Проект настроен так, чтобы администратору приходилось выполнять минимум действий, поэтому сконфигурированное приложение запускается лишь парой команд. Нет необходимости настраивать базу данных, так как она запускается в docker-контейнере рядом с контейнером приложения. И так для запуска приложения вам потребуется выполнить следующие действия:

Все команды выполняются в терминале в корне проекта!
* Сделать клонирование репозитория командой `git clone {адрес репозитория}`
* Настроить соответствующие файлы конфигураций:
* .env - установить следующие значения:
* `BOT_USER_NAME` - Имя бота
* `BOT_TOKEN` - Токен бота (необходимо создать нового бота по [инструкции](https://core.telegram.org/bots#3-how-do-i-create-a-bot))
* `DATASOURCE_DB` - Название базы данных (опционально)
* `DATASOURCE_URL` - url базы данных со слэшом в конце "/" (опционально)
* `DATASOURCE_USER` - Имя пользователя базы данных (опционально)
* `DATASOURCE_PASS` - Пароль пользователя базы данных (опционально)
* application-bot.yml - установить значения для начальной настройки администраторов, чатов пользователей и модераторов и т.д.
* С помощью Maven собрать проект командой `mvn clean package`
* Установить и запустить Docker, затем выполнить команду `docker-compose up` или `docker-compose up -d` (для запуска в фоновом режиме)

---
## Команды бота

### Команды администраторов
_Доступны администраторам в приватном чате_

| Команда | Описание |
|------------------------------------|---------------------------------------------------------|
| /help | вывод списка доступных команд |
| /currentSettings | вывод текущих настроек чатов |
| /addModerChat {id} | добавление чата модераторов |
| /addUserChat {id} | добавление чата пользователей |
| /deleteModerChat {id} | удаление чата модераторов |
| /deleteUserChat {id} | удаление чата пользователей |
| /bindUserChatToModer {id} {id} | привязка чата пользователей к чату модераторов |
| /unbindUserChatFromModer {id} {id} | удаление привязки чата пользователей к чату модераторов |


### Команды модераторов
_Доступны в чатах модераторов_

| Команда | Описание |
|---------------------|---------------------------------------------------------------------------------|
| /luckyList | вывод списка юбилейных вступлений во всех привязанных чатах пользователей |
| /luckyList {id} | вывод списка юбилейных вступлений в конкретном чате |
| /chooseLucky | вывод списка **ожидающих поздравления** во всех привязанных чатах пользователей |
| /chooseLucky {id} | вывод списка **ожидающих поздравления** в конкретном чате |


---
## Web API
На всякий случай для бота сделан небольшой API.<br/>По умолчанию используется порт 8080.

| Endpoint | Описание |
|------------------|-------------------------------------------------------------------------------------------------|
| /api/start | Ручной старт бота |
| /api/stop | Ручная остановка бота |
| /api/status | Текущий статус бота |
| /api/sendMessage | Отправка сообщения от бота<br/> `chatId` ID чата, куда отправить<br/> `message` текст сообщения |


---
## Настройки приложения

Конфигурационные файлы приложения разделены на две части:
### Настройки для администраторов _(application.yml)_:
* Spring
* Database _(environment vars)_
* Bot token _(environment vars)_


### Настройки функций бота _(application-bot.yml)_:
Настройки групп в приоритете берутся из базы данных. Из файла конфигурации эти настройки подтягиваются только в случае отсутствия таковых в БД, либо если включен флаг перезаписи настроек.

* Настройки для чатов `chats-settings`:
* `administrators` - список ID администраторов
* `anniversary-numbers` - список юбилейных номеров
* `anniversary-numbers-delta` - количество дополнительно отслеживаемых вступлений
* `chats-settings` - настройки групп. Настройки прописываются иерархически: к каждому ID группы модераторов прописывается список ID групп пользователей.
* `rewrite-chats-settings-in-database-on-startup` - перезапись настроек групп в базе данных на настройки из конфигурационного файла.


* Настройки шаблонов `message-templates`:
* `variables` - названия переменных шаблонов
* `plugs` - дополнительные моменты
* `join-congratulation` - шаблон сообщения поздравления пользователя
* `join-alert` - шаблон уведомления модераторов о юбилейном вступлении пользователя
* `join-user-info` - шаблон данных пользователя при использовании команды `/luckyList`


---
## Примеры сообщений

Уведомление модераторов

🎉 “Java разработчик” 👤 Василий (ника нет),
🔢 500 🕐 26.06.22 10:56
[ПОЗДРАВИТЬ] [ОТКЛОНИТЬ]

Поздравление пользователя

🎉 Поздравляю, Никита,
как же удачно попали в нужное время и в нужное время!
Вы 500 участник коммьюнити.
Вас ждут плюшки и печенюшки!🎉

Вывод списка счастливчиков

==================================================
Группа: “Java разработчик”
==================================================
👑👑👑 👤Василий (ника нет),
🔢 500 🕐 20.07.22 22:00

👤GroupSkillboxBot (GroupSkillboxBot),
🔢 501 🕐 20.07.22 23:06

👑👑👑 👤Никита (nikita),
🔢 1000 🕐 22.07.22 01:00
36 changes: 36 additions & 0 deletions application-bot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
chats-settings:
administrators:
- 1039061325 # pavel
- 161855902 # max
- 1004758635 # alex
anniversary-numbers-delta: 3
anniversary-numbers:
- 5
- 50
- 100
- 500
- 777
- 1000
- 5000
- 10000
chats-settings:
-1001523814996: #Хакатон и телеграм бот (Skillbox)
- -1001523814996 # Хакатон и телеграм бот (Skillbox)
- -1001781082670 # Java-диплом с нуля (Skillbox)

rewrite-chats-settings-in-database-on-startup: false

message-templates:
variables:
chat-name: "{НазваниеГруппы}"
user-name: "{ИмяУчастника}"
user-nickname: "{НикУчастника}"
join-date: "{ВремяВступления}"
join-number: "{НомерВступления}"
plugs:
no-nick: "ника нет"
winner-crown: "👑👑👑"
join-date-format: "dd.MM.yy HH:mm"
join-congratulation: "🎉 Поздравляю, *{ИмяУчастника}*, как же удачно попали в нужное время и в нужное время!\nВы *{НомерВступления}* участник коммьюнити.\nВас ждут плюшки и печенюшки!🎉"
join-alert: " 🎉 В *{НазваниеГруппы}* группу вступил юбилейный пользователь\n{ИмяУчастника} (*{НикУчастника}*),\n 🔢 *{НомерВступления}* 🕐 {ВремяВступления}"
join-user-info: " 👤{ИмяУчастника} ({НикУчастника}),\n 🔢 *{НомерВступления}* 🕐 {ВремяВступления}"
31 changes: 31 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
version: "3.9"
services:
postgres:
container_name: postgres
image: postgres:alpine
restart: always
ports:
- "5431:5432"
environment:
POSTGRES_DB: ${DATASOURCE_DB:-tg-bot-users}
POSTGRES_USER: ${DATASOURCE_USER:-tg-admin}
POSTGRES_PASSWORD: ${DATASOURCE_PASS:-postgres}
volumes:
- C:\docker\postgres:/var/lib/postgres
tg-bot-users:
container_name: tg-bot-users
image: tg-bot-users
restart: always
build:
context: .
ports:
- "8080:8080"
environment:
BOT_USER_NAME: ${BOT_USER_NAME}
BOT_TOKEN: ${BOT_TOKEN}
DATASOURCE_URL: ${DATASOURCE_URL:-jdbc:postgresql://host.docker.internal:5431/}${DATASOURCE_DB:-tg-bot-users}
DATASOURCE_USER: ${DATASOURCE_USER:-tg-admin}
DATASOURCE_PASS: ${DATASOURCE_PASS:-postgres}
depends_on:
postgres:
condition: service_started
Loading