add all bot

This commit is contained in:
2023-08-13 20:22:15 +07:00
parent 116f4041fa
commit 2889f35a3d
11 changed files with 307 additions and 5 deletions
+53
View File
@@ -0,0 +1,53 @@
package bot_all
import (
"context"
"strings"
"github.com/samber/lo"
"git.3crabs.ru/VLADIMIR/butler/internal/modules/messenger"
"git.3crabs.ru/VLADIMIR/butler/internal/modules/storage"
"git.3crabs.ru/VLADIMIR/butler/internal/services/bot"
)
type botAll struct {
messenger messenger.IMessenger
storage storage.IStorage
}
func NewBotAll(
messenger messenger.IMessenger,
storage storage.IStorage,
) bot.IBot {
return &botAll{
messenger: messenger,
storage: storage,
}
}
func (bot *botAll) Process(ctx context.Context, msg messenger.Message) error {
if err := bot.storage.UpsertUser(ctx, storage.User{ChatID: msg.ChatID, UserID: msg.UserID}); err != nil {
return err
}
if !strings.Contains(msg.Text, "@all") {
return nil
}
users, err := bot.storage.GetAllUsersByChatID(ctx, msg.ChatID)
if err != nil {
return err
}
usernames := lo.Map(users, func(item storage.User, _ int) string {
return item.UserID
})
if len(usernames) > 0 {
bot.messenger.SendMessage(
ctx,
&messenger.Message{
ChatID: msg.ChatID,
Text: strings.Join(usernames, " "),
},
)
}
return nil
}
+62
View File
@@ -0,0 +1,62 @@
package bot_all
import (
"context"
"testing"
"go.uber.org/mock/gomock"
"git.3crabs.ru/VLADIMIR/butler/internal/modules/messenger"
messenger_mocks "git.3crabs.ru/VLADIMIR/butler/internal/modules/messenger/mocks"
"git.3crabs.ru/VLADIMIR/butler/internal/modules/storage"
storage_mocks "git.3crabs.ru/VLADIMIR/butler/internal/modules/storage/mocks"
)
func Test_botAll_Process(t *testing.T) {
t.Parallel()
tests := []struct {
name string
messenger func(ctrl *gomock.Controller) messenger.IMessenger
storage func(ctrl *gomock.Controller) storage.IStorage
msg messenger.Message
wantErr bool
}{
{
name: "hello message",
messenger: func(ctrl *gomock.Controller) messenger.IMessenger {
m := messenger_mocks.NewMockIMessenger(ctrl)
m.EXPECT().SendMessage(gomock.Any(), gomock.Any()).Times(0)
return m
},
storage: func(ctrl *gomock.Controller) storage.IStorage {
m := storage_mocks.NewMockIStorage(ctrl)
m.EXPECT().UpsertUser(gomock.Any(), storage.User{ChatID: "123", UserID: "username"}).Times(1)
m.EXPECT().GetAllUsersByChatID(gomock.Any(), gomock.Any()).Times(0)
return m
},
msg: messenger.Message{
ChatID: "123",
UserID: "username",
Text: "hello",
},
wantErr: false,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
ctx := context.Background()
ctrl := gomock.NewController(t)
defer ctrl.Finish()
bot := &botAll{
messenger: tt.messenger(ctrl),
storage: tt.storage(ctrl),
}
if err := bot.Process(ctx, tt.msg); (err != nil) != tt.wantErr {
t.Errorf("botAll.Process() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
+11
View File
@@ -0,0 +1,11 @@
package bot
import (
"context"
"git.3crabs.ru/VLADIMIR/butler/internal/modules/messenger"
)
type IBot interface {
Process(ctx context.Context, msg messenger.Message) error
}
+9 -3
View File
@@ -2,21 +2,25 @@ package listener
import (
"context"
"fmt"
"log"
"git.3crabs.ru/VLADIMIR/butler/internal/modules/messenger"
"git.3crabs.ru/VLADIMIR/butler/internal/services"
"git.3crabs.ru/VLADIMIR/butler/internal/services/bot"
)
type listenerService struct {
messenger messenger.IMessenger
bots []bot.IBot
}
func NewListener(
messenger messenger.IMessenger,
bots []bot.IBot,
) services.IService {
return &listenerService{
messenger: messenger,
bots: bots,
}
}
@@ -29,8 +33,10 @@ func (s *listenerService) Run(ctx context.Context) error {
}
return err
}
if err := s.messenger.SendMessage(ctx, msg); err != nil {
fmt.Println(err)
for b := range s.bots {
if err := b.Process(ctx, msg); err != nil {
log.Println(err)
}
}
}
}