-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodule.go
70 lines (57 loc) · 1.42 KB
/
module.go
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package server
import (
"fmt"
"sync"
)
var (
Modules = make(map[string]ModuleInfo)
modulesMu sync.RWMutex
)
type Module interface {
GetModuleInfo() ModuleInfo
// Module 的生命周期
// Init 初始化
// 待所有 Module 初始化完成后
// 进行服务注册 Serve
Init()
// PostInit 第二次初始化
// 调用该函数时,所有 Module 都已完成第一段初始化过程
// 方便进行跨Module调用
PostInit()
// Serve 向Bot注册服务函数
// 结束后调用 Start
Serve(server *Server)
// Start 启用Module
// 此处调用为
// ``` go
// go Start()
// ```
// 结束后正式开启服务
Start(server *Server)
// Stop 应用结束时对所有 Module 进行通知
// 在此进行资源回收
Stop(server *Server, wg *sync.WaitGroup)
}
// RegisterModule - 向全局添加 Module
func RegisterModule(instance Module) {
mod := instance.GetModuleInfo()
if mod.Instance == nil {
panic("missing ModuleInfo.Instance")
}
modulesMu.Lock()
defer modulesMu.Unlock()
if _, ok := Modules[mod.ID.String()]; ok {
panic(fmt.Sprintf("module already registered: %s", mod.ID))
}
Modules[mod.ID.String()] = mod
}
// GetModule - 获取一个已注册的 Module 的 ModuleInfo
func GetModule(id ModuleID) (ModuleInfo, error) {
modulesMu.Lock()
defer modulesMu.Unlock()
m, ok := Modules[id.String()]
if !ok {
return ModuleInfo{}, fmt.Errorf("module not registered: %s", id)
}
return m, nil
}