-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommand_handler.go
More file actions
51 lines (47 loc) · 2.6 KB
/
Copy pathcommand_handler.go
File metadata and controls
51 lines (47 loc) · 2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package vkc
// Функция обработчика команды. Получает контекст и возвращает ошибку или nil.
type HandlerFunc[DEPS any] func(ctx CommandContext[DEPS]) error
// Проверка доступа к команде. Используется для проверки прав пользователя.
//
// Пример использования:
//
// var CheckAdmin = HandlerAccessCheck[any]{
// Checker: func(handler *CommandHandler[any], ctx CommandContext[any]) bool {
// return ctx.SenderID == 1
// },
// }
// // позднее в обработчике:
// &CommandHandler[any]{
// Pattern: Text("admincmd"),
// AccessCheck: &CheckAdmin,
// Executor: func(ctx CommandContext[any]) error { /* ... */ },
// }
//
// Если для пользователя, вызвавшего команду, не проходит проверка, то вызывается обработчик OnNoPermissions (если он задан в объекте команд).
type HandlerAccessCheck[DEPS any] struct {
Checker func(handler *CommandHandler[DEPS], ctx CommandContext[DEPS]) bool
}
// Обработчик команды.
// Содержит необходимый минимум для большинства ботов: шаблон, по которому вызывается команда, объект помощи, проверку на доступ и функцию-исполнитель.
//
// Пример обработчика:
//
// /* в качестве DepsType указывается структура или интерфейс
// из дженерика в объекте команд;
// впоследствии в контекст обработчика будет передано значение этого типа в поле Dependency */
// var HandleSomeCommand = CommandHandler[DepsType]{
// Pattern: Text("some"), // шаблон "только строка `some`"
// Help: CommandHelp{ /* помощь по команде */ },
// AccessCheck: &HandlerAccessCheck[DepsType]{ /* проверка доступа */ },
// Executor: func(ctx CommandContext[DepsType]) error { /* логика команды */ },
// }
type CommandHandler[DEPS any] struct {
Pattern CommandPattern
Help CommandHelp
AccessCheck *HandlerAccessCheck[DEPS]
Executor HandlerFunc[DEPS]
}
// Метод для проверки доступности команды для пользователя.
func (handler *CommandHandler[any]) IsAccessAvailable(ctx CommandContext[any]) bool {
return handler.AccessCheck == nil || handler.AccessCheck.Checker(handler, ctx)
}