package main import ( "crypto/rand" "fmt" "math" "strings" "time" "github.com/bwmarrin/discordgo" "PermissionGacha/db" ) const emojiCheck = "✅" const prestigeRequirement = 90000 var prestigeList = make(map[string]string) func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { if m.Author.Bot { return } go incrementXP(s, m) if m.Content == "pgqlevel" { handleXPRequest(s, m) } if m.Content == "pgqshard" { handleShardRequest(s, m) } if m.Content == "pgqprestige" { handlePrestigeRequest(s, m) } if strings.HasPrefix(m.Content, "pgqstar ") { handleStarRequest(s, m) } } func handleXPRequest(s *discordgo.Session, m *discordgo.MessageCreate) { level, rawXP, err := getLevelAndXP(m.Author.ID) if err != nil { logError(s, err) return } randomSource := make([]byte, 1) rand.Read(randomSource) xp := rawXP - (rawXP % 100) + ((int(randomSource[0]) + 128) % 100) levelUpRequirement := levelUpRequirementCache[level-1] if level > 1 { levelUpRequirement -= levelUpRequirementCache[level-2] } s.ChannelMessageSend( m.ChannelID, fmt.Sprintf( "<@%s> is now level %d. (%d XP/%d XP) [%.1f%%]", m.Author.ID, level, xp, levelUpRequirement, float64(xp)/float64(levelUpRequirement)*100, ), ) } func handleShardRequest(s *discordgo.Session, m *discordgo.MessageCreate) { shard, err := db.GetShard(m.Author.ID) if err != nil { logError(s, err) return } s.ChannelMessageSend( m.ChannelID, fmt.Sprintf( "<@%s> has %d shards.", m.Author.ID, shard, ), ) } func handlePrestigeRequest(s *discordgo.Session, m *discordgo.MessageCreate) { currentPrestigeLevel, err := db.GetPrestigeMultiplier(m.Author.ID) if err != nil { logError(s, err) return } xp, err := db.GetXP(m.Author.ID) if err != nil { logError(s, err) return } newPrestigeLevel := xp/prestigeRequirement + 1 if xp < levelUpRequirementCache[3] && currentPrestigeLevel == 1 { s.ChannelMessageSend(m.ChannelID, "**PRESTIGE > **Prestige is only unlocked after level 5!") return } var lowerLevelWarning string if newPrestigeLevel <= currentPrestigeLevel { lowerLevelWarning = "**WARNING:** *Your new prestige multiplier is __NOT__ higher than your current prestige multiplier.*" } nearestPowerOfTen := math.Pow10(int(math.Floor(math.Log10(float64(newPrestigeLevel))))) nextNearestLogicalPrestige := int((math.Floor(float64(newPrestigeLevel)/nearestPowerOfTen) + 1) * nearestPowerOfTen) msg, err := s.ChannelMessageSend( m.ChannelID, fmt.Sprintf( "<@%s>, here's your prestige multiplier:\n**Now: **__%dx__\n**New: **__%dx__\n**Next: **__%dx__ [%.1f%%]\n%s\n"+ "React with :white_check_mark: to proceed with prestiging.", m.Author.ID, currentPrestigeLevel, newPrestigeLevel, nextNearestLogicalPrestige, float64(xp)/float64(prestigeRequirement*(nextNearestLogicalPrestige-1))*100, lowerLevelWarning, ), ) if err != nil { logError(s, "handlePrestigeRequest", "send", err) return } prestigeList[msg.ID] = m.Author.ID err = s.MessageReactionAdd(msg.ChannelID, msg.ID, emojiCheck) if err != nil { logError(s, "handlePrestigeRequest", "addReaction", err) return } go func() { time.Sleep(15 * time.Second) err = s.MessageReactionsRemoveAll(msg.ChannelID, msg.ID) if err != nil { logError(s, "handlePrestigeRequest", "removeReaction", err) } }() } func checkPrestigeReact(s *discordgo.Session, m *discordgo.MessageReactionAdd) { if prestigeList[m.MessageID] != m.UserID { return } if m.Emoji.Name != emojiCheck { return } xp, err := db.GetXP(m.UserID) if err != nil { logError(s, err) return } newPrestigeLevel := xp/prestigeRequirement + 1 go cleanUpRole(s, m.UserID) err = db.SetPrestigeMultiplier(m.UserID, newPrestigeLevel) if err != nil { logError(s, err) return } s.ChannelMessageSend(m.ChannelID, fmt.Sprintf( "**PRESTIGE > ** <@%s>, you have prestiged!", m.UserID, ), ) } func handleStarRequest(s *discordgo.Session, m *discordgo.MessageCreate) { commandSplit := strings.SplitN(m.Content, " ", 2) if len(commandSplit) == 1 { s.ChannelMessageSend(m.ChannelID, "**STAR > **It doesn't seem like you've sent a valid message link!") return } linkSplit := strings.SplitN(commandSplit[1], "/", 7) if len(linkSplit) < 7 { s.ChannelMessageSend(m.ChannelID, "**STAR > **It doesn't seem like you've sent a valid message link!") return } if linkSplit[0] != "https:" && linkSplit[0] != "http:" { s.ChannelMessageSend(m.ChannelID, "**STAR > **It doesn't seem like you've sent a valid message link!") return } if linkSplit[2] != "discordapp.com" && !strings.HasSuffix(linkSplit[2], ".discordapp.com") { s.ChannelMessageSend(m.ChannelID, "**STAR > **It doesn't seem like you've sent a valid message link!") return } if linkSplit[3] != "channels" { s.ChannelMessageSend(m.ChannelID, "**STAR > **It doesn't seem like you've sent a valid message link!") return } if linkSplit[4] != m.GuildID { s.ChannelMessageSend(m.ChannelID, "**STAR > **It doesn't seem like you've sent a valid message link!") return } err := s.MessageReactionAdd(linkSplit[5], linkSplit[6], starEmoji) if err != nil { s.ChannelMessageSend(m.ChannelID, "**STAR > **It doesn't seem like you've sent a valid message link!") } }