package main import "net/http" type levelUpAchievement struct { GetName func() string GetText func() string GetKeyName func() string // Processes the message, returns true if the achievement was triggered ProcessMessage func(ustat *UserLevelUpStats, m *Message) bool } func (achieve *levelUpAchievement) DoesUserHave(ustat *UserLevelUpStats) bool { //val, ok := ustat.Achievements[achieve.GetKeyName()] //if ustat.Achievements return false } type levelUpAchieveStatProcessor struct { Achievements []levelUpAchievement } func (p *levelUpAchieveStatProcessor) GetName() string { return "LevelUp Achievements" } func (p *levelUpAchieveStatProcessor) GetStatKeys() []string { return []string{ "levelupachievement-*", } } // UserLevelUpStats is just a struct for caching user data... // This processor needs to crunch a lot of numbers, this should make // it quicker/easier type UserLevelUpStats struct { Name string Xp int ChannelStats map[string]int OtherStats map[string]int Achievements map[string]bool CurrentMsg *Message CurrentCh *Channel } func (p *levelUpAchieveStatProcessor) ProcessMessage(m *Message) { var u *User var err error if u, err = getUserInfo(m.User); err != nil { return } userStat := UserLevelUpStats{Name: u.Name, CurrentMsg: m} userStat.Xp, _ = getUserStat(u.ID, "levelup-xp") userStat.ChannelStats = getAllLevelUpChannelXp(u.ID) userStat.OtherStats = getAllNonLevelUpStats(u.ID) userStat.Achievements = getAllUserAchievements(u.ID) chnl, err := getChannelInfo(m.Channel) if err == nil { userStat.CurrentCh = chnl } for _, achieve := range p.Achievements { if !achieve.DoesUserHave(&userStat) { // User doesn't already have this achieve, let it process the message achieve.ProcessMessage(&userStat, m) } } } func (p *levelUpAchieveStatProcessor) ProcessAdminMessage(m *Message) {} func (p *levelUpAchieveStatProcessor) ProcessBotMessage(m *Message) {} func (p *levelUpAchieveStatProcessor) ProcessUserMessage(m *Message) {} func (p *levelUpAchieveStatProcessor) ProcessAdminUserMessage(m *Message) {} func (p *levelUpAchieveStatProcessor) ProcessBotUserMessage(m *Message) {} func (p *levelUpAchieveStatProcessor) ProcessChannelMessage(m *Message) { } func (p *levelUpAchieveStatProcessor) ProcessAdminChannelMessage(m *Message) {} func (p *levelUpAchieveStatProcessor) ProcessBotChannelMessage(m *Message) {} /* * Web Site Module */ type levelUpAchieveWebModule struct{} func (wm *levelUpAchieveWebModule) GetName() string { return "LevelUp Achievement Web Module" } func (wm *levelUpAchieveWebModule) GetRoutes() map[string]func(http.ResponseWriter, *http.Request) { ret := make(map[string]func(http.ResponseWriter, *http.Request)) ret["/levelup/achieve"] = wm.handleLevelUpAchieveGeneral ret["/levelup/achieve/admin"] = wm.handleLevelUpAchieveAdmin return ret } func (wm *levelUpAchieveWebModule) Register() { for k, v := range wm.GetRoutes() { r.HandleFunc(k, v) } } func (wm *levelUpAchieveWebModule) GetMenuEntries() []menuItem { var ret []menuItem //ret = append(ret, menuItem{Text: "Achieve GET!", Link: "/levelup/achieve"}) return ret } func (wm *levelUpAchieveWebModule) GetBottomMenuEntries() []menuItem { var ret []menuItem return ret } func (wm *levelUpAchieveWebModule) handleLevelUpAchieveAdmin(w http.ResponseWriter, req *http.Request) { // TODO: Test for admin login initRequest(w, req) } func (wm *levelUpAchieveWebModule) handleLevelUpAchieveGeneral(w http.ResponseWriter, req *http.Request) { initRequest(w, req) //setMenuItemActive("Achieve GET!") } /* * Achieve Stat Processor Initialization * It's down here because it's so long what with all * of it's achievements and such. */ func (p *levelUpAchieveStatProcessor) Initialize() { // TODO: Set up achievements p.Achievements = append(p.Achievements, // Early Bird Achievement levelUpAchievement{ GetName: func() string { return "Early Bird" }, GetText: func() string { return "You seem to enjoy chatting before 7 AM" }, GetKeyName: func() string { return "levelup-achieve-earlybird" }, ProcessMessage: func(u *UserLevelUpStats, m *Message) bool { // TODO: What condition makes this happen? if m.Time.Hour() > 3 && m.Time.Hour() < 7 { numMsgs := 0 numMsgs = numMsgs + u.OtherStats["message-hour-04"] numMsgs = numMsgs + u.OtherStats["message-hour-05"] numMsgs = numMsgs + u.OtherStats["message-hour-06"] /* if chnl.Name == "random" { addUserStat(m.User, "levelup-xp", 1) } else if chnl.Name == "general" { addUserStat(m.User, "levelup-xp", 2) } else { addUserStat(m.User, "levelup-xp", 3) addUserStat(m.User, "levelup-xp-"+chnl.Name, 1) } */ } return false }, }, ) p.Achievements = append(p.Achievements, // Night Owl Achievement levelUpAchievement{ GetName: func() string { return "Night Owl" }, GetText: func() string { return "You seem to enjoy chatting after 12 AM" }, GetKeyName: func() string { return "levelup-achieve-nightowl" }, ProcessMessage: func(u *UserLevelUpStats, m *Message) bool { // TODO: What condition makes this happen? return false }, }, ) p.Achievements = append(p.Achievements, // Around the Clock Achievement levelUpAchievement{ GetName: func() string { return "Around the Clock" }, GetText: func() string { return "You have sent at least one message in every hour of the day" }, GetKeyName: func() string { return "levelup-achieve-aroundtheclock" }, ProcessMessage: func(u *UserLevelUpStats, m *Message) bool { // TODO: What condition makes this happen? return false }, }, ) p.Achievements = append(p.Achievements, // Beginner Achievement levelUpAchievement{ GetName: func() string { return "Beginner" }, GetText: func() string { return "Get on the XP Chart" }, GetKeyName: func() string { return "levelup-achieve-beginner" }, ProcessMessage: func(u *UserLevelUpStats, m *Message) bool { // TODO: What condition makes this happen? return false }, }, ) p.Achievements = append(p.Achievements, // Experienced Achievement levelUpAchievement{ GetName: func() string { return "Experienced" }, GetText: func() string { return "Reach level 5" }, GetKeyName: func() string { return "levelup-achieve-experienced" }, ProcessMessage: func(u *UserLevelUpStats, m *Message) bool { // TODO: What condition makes this happen? return false }, }, ) p.Achievements = append(p.Achievements, // Super Advanced! Achievement levelUpAchievement{ GetName: func() string { return "Super Advanced!" }, GetText: func() string { return "Reach level 10" }, GetKeyName: func() string { return "levelup-achieve-superadvanced" }, ProcessMessage: func(u *UserLevelUpStats, m *Message) bool { // TODO: What condition makes this happen? return false }, }, ) }