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 關注
- 136 瀏覽
添加回答
舉報