2 回答
TA贡献1806条经验 获得超5个赞
我不知道该库的上下文,所以我不确定我在这里写的内容对您是否有意义:)但是通过查看 API,SessionFunc是 a func(token string) (*discordgo.Session, error),即接收 astring并返回 a 的函数Session和一个error. 所以你可以做这样的事情来覆盖它:
func main() {
manager := dshardmanager.New("Bot " + token)
manager.SessionFunc = func(token string) (*discordgo.Session, error) {
// use "token"
// if invalid:
if token == "" {
// return an error
return nil, fmt.Errorf("invalid token")
}
// otherwise, return a valid session
return &discordgo.Session{}
}
// more stuff happens down here
}
该代码显然非常通用,但主要思想是您需要使用确切的标头定义该函数并实现它。例如,我不知道如何评估令牌参数或创建discordgo.Session. 或者如何使用 来配置TrackRoles或值。这仅针对该库,但我想这对你来说比对我更有意义:)TrackPresencesSessionFunc
您还可以在其他地方使用该确切的标头定义常规函数:
func createNewSession(token string) (*discordgo.Session, error) {
// use "token"
// if invalid:
if token == "" {
// return an error
return nil, fmt.Errorf("invalid token")
}
// otherwise, return a valid session
return &discordgo.Session{}
}
并设置它:
func main() {
manager := dshardmanager.New("Bot " + token)
manager.SessionFunc = createNewSession
// more stuff happens down here
}
两种方法的工作原理相同。
反射[几乎]从来都不是执行这些操作的推荐方法,如果库创建者将这些属性设为私有,则不应从外部更改/访问它们。
TA贡献1828条经验 获得超3个赞
这不会让你改变bareSession。但如果您需要*discordgo.Session使用自定义参数派生新的参数,您可以执行类似于以下操作的操作。
func MySessionFunc(m *dshardmanager.Manager) dshardmanager.SessionFunc {
return func(token string) (*discordgo.Session, error) {
//Call default Session allocator
s, err := m.StdSessionFunc(token)
if err != nil {
return nil, err
}
//Then, change its exported fields
s.State.TrackRoles = false
s.TrackPresences = false
return s, nil
}
}
func main() {
manager := dshardmanager.New("Bot " + token)
manager.SessionFunc = MySessionFunc(manager)
}
- 2 回答
- 0 关注
- 106 浏览
添加回答
举报