✨ Implement the check if a users leaved or nor even if there are more then 50 members
This commit is contained in:
parent
33d68aaa14
commit
f2d964a2f3
97
channels/leaveduserchecker.go
Normal file
97
channels/leaveduserchecker.go
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
package channels
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.dragon-labs.de/alphyron/group_helper/logic"
|
||||||
|
"git.dragon-labs.de/alphyron/group_helper/models"
|
||||||
|
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CheckForLeavingUser(ticker *time.Ticker, quitChannel <-chan struct{}, groupHelperService logic.GroupHelperService, bot *tgbotapi.BotAPI) {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ticker.C:
|
||||||
|
|
||||||
|
groups, err := groupHelperService.ListGroups()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error while getting all groups in the LeavingChecking routine")
|
||||||
|
log.Println(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, group := range groups {
|
||||||
|
time.Sleep(500 * time.Millisecond)
|
||||||
|
config := tgbotapi.ChatConfig{
|
||||||
|
ChatID: group.GroupID,
|
||||||
|
}
|
||||||
|
|
||||||
|
teleSize, _ := bot.GetChatMembersCount(config)
|
||||||
|
teleSize -= 1
|
||||||
|
sqlSize, err := groupHelperService.GetGroupDatabaseSize(group)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error while counting the user in group")
|
||||||
|
log.Println(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if teleSize == sqlSize {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if sqlSize < teleSize {
|
||||||
|
group.Size = teleSize
|
||||||
|
groupHelperService.UpdateGroup(group)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if teleSize < sqlSize {
|
||||||
|
checkGroupUser(group, groupHelperService, bot)
|
||||||
|
groupHelperService.UpdateGroup(group)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case <-quitChannel:
|
||||||
|
ticker.Stop()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkGroupUser(group *models.Group, groupHelperService logic.GroupHelperService, bot *tgbotapi.BotAPI) {
|
||||||
|
rate := time.Second / 5
|
||||||
|
throttle := time.Tick(rate)
|
||||||
|
|
||||||
|
users, err := groupHelperService.ListGroupUsers(group)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error while getting the users for group while checking for leaved user")
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, user := range users {
|
||||||
|
<-throttle // rate limit our Service.Method RPCs
|
||||||
|
|
||||||
|
userConfig := tgbotapi.ChatConfigWithUser{
|
||||||
|
ChatID: group.GroupID,
|
||||||
|
UserID: int(user.UserID),
|
||||||
|
}
|
||||||
|
|
||||||
|
member, _ := bot.GetChatMember(userConfig)
|
||||||
|
|
||||||
|
if !member.HasLeft() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
leaveMessage := group.UserLeaveMessage
|
||||||
|
//TODO Replace placeholder
|
||||||
|
|
||||||
|
msg := tgbotapi.NewMessage(group.GroupID, leaveMessage)
|
||||||
|
msg.ParseMode = "Markdown"
|
||||||
|
bot.Send(msg)
|
||||||
|
groupHelperService.UserLeaveGroup(user, group)
|
||||||
|
}
|
||||||
|
}
|
@ -99,6 +99,10 @@ func (g groupHelperService) ListGroups() ([]*models.Group, error) {
|
|||||||
return g.groupHelperRepo.ListGroups()
|
return g.groupHelperRepo.ListGroups()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g groupHelperService) ListGroupUsers(group *models.Group) ([]*models.User, error) {
|
||||||
|
return g.groupHelperRepo.ListGroupUsers(group)
|
||||||
|
}
|
||||||
|
|
||||||
func (g groupHelperService) ListUsers() ([]*models.User, error) {
|
func (g groupHelperService) ListUsers() ([]*models.User, error) {
|
||||||
return g.groupHelperRepo.ListUsers()
|
return g.groupHelperRepo.ListUsers()
|
||||||
}
|
}
|
||||||
|
@ -19,5 +19,6 @@ type GroupHelperService interface {
|
|||||||
IsUserInGroup(*models.User, *models.Group) (bool, error)
|
IsUserInGroup(*models.User, *models.Group) (bool, error)
|
||||||
|
|
||||||
ListGroups() ([]*models.Group, error)
|
ListGroups() ([]*models.Group, error)
|
||||||
|
ListGroupUsers(*models.Group) ([]*models.User, error)
|
||||||
ListUsers() ([]*models.User, error)
|
ListUsers() ([]*models.User, error)
|
||||||
}
|
}
|
||||||
|
6
main.go
6
main.go
@ -65,10 +65,12 @@ func main() {
|
|||||||
cm := InitialCommandManager(bot, service)
|
cm := InitialCommandManager(bot, service)
|
||||||
rm := InitialRoutineManager(bot, cm, service, userData)
|
rm := InitialRoutineManager(bot, cm, service, userData)
|
||||||
|
|
||||||
ticker := time.NewTicker(1 * time.Minute)
|
verifyTicker := time.NewTicker(1 * time.Minute)
|
||||||
|
leaveTicker := time.NewTicker(1 * time.Minute)
|
||||||
quit := make(chan struct{})
|
quit := make(chan struct{})
|
||||||
|
|
||||||
go channels.CheckUnverifiedUser(ticker, quit, service, bot, userData)
|
go channels.CheckUnverifiedUser(verifyTicker, quit, service, bot, userData)
|
||||||
|
go channels.CheckForLeavingUser(leaveTicker, quit, service, bot)
|
||||||
|
|
||||||
rm.StartUpdates()
|
rm.StartUpdates()
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,10 @@ type Group struct {
|
|||||||
Users []*User `gorm:"many2many:GroupUser;"`
|
Users []*User `gorm:"many2many:GroupUser;"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (Group) TableName() string {
|
||||||
|
return "Groups"
|
||||||
|
}
|
||||||
|
|
||||||
func (group *Group) FillDefaultValues() {
|
func (group *Group) FillDefaultValues() {
|
||||||
if len(group.UserKickMessage) == 0 {
|
if len(group.UserKickMessage) == 0 {
|
||||||
group.UserKickMessage = "[{{user.firstname}} {{user.lastname}}](tg://user?id={{user.id}}) did not verify!\n They are going to leave us."
|
group.UserKickMessage = "[{{user.firstname}} {{user.lastname}}](tg://user?id={{user.id}}) did not verify!\n They are going to leave us."
|
||||||
|
@ -5,3 +5,7 @@ type User struct {
|
|||||||
UserID int64 `json:"user_id"`
|
UserID int64 `json:"user_id"`
|
||||||
Groups []*Group `json:"groups" gorm:"many2many:GroupUser;"`
|
Groups []*Group `json:"groups" gorm:"many2many:GroupUser;"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (User) TableName() string {
|
||||||
|
return "Users"
|
||||||
|
}
|
||||||
|
@ -183,6 +183,16 @@ func (g groupHelperRepository) ListGroups() ([]*models.Group, error) {
|
|||||||
return groups, nil
|
return groups, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) ListGroupUsers(group *models.Group) ([]*models.User, error) {
|
||||||
|
var users []*models.User
|
||||||
|
err := g.Conn.Model(group).Related(&users, "GroupUser").Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("problem while getting all users from group - " + err.Error())
|
||||||
|
}
|
||||||
|
return users, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (g groupHelperRepository) ListUsers() ([]*models.User, error) {
|
func (g groupHelperRepository) ListUsers() ([]*models.User, error) {
|
||||||
var users []*models.User
|
var users []*models.User
|
||||||
err := g.Conn.Find(&users).Error
|
err := g.Conn.Find(&users).Error
|
||||||
|
Loading…
Reference in New Issue
Block a user