protected override string FormatState(PlayerInfoResponse playerInfo, DiscordPresence presence)
        {
            bool hasActivePlanet   = !string.IsNullOrWhiteSpace(playerInfo.ActivePlanet);
            bool hasActiveZone     = !string.IsNullOrWhiteSpace(playerInfo.ActiveZonePosition);
            bool hasActiveBossZone = !string.IsNullOrWhiteSpace(playerInfo.ActiveBossGame);

            var state = "Inactive";

            if (hasActivePlanet && (hasActiveZone || hasActiveBossZone))
            {
                state = $"Planet {playerInfo.ActivePlanet} - ";
                if (hasActiveBossZone)
                {
                    state += $"Boss Zone";
                }
                else if (hasActiveZone)
                {
                    state += $"Zone {playerInfo.ActiveZonePosition}";
                }
                var planet = SaliensApi.GetPlanet(playerInfo.ActivePlanet);
                if (hasActiveZone && int.TryParse(playerInfo.ActiveZonePosition, out int zonePos))
                {
                    var zone = planet.Zones[zonePos];
                    if (zone != null)
                    {
                        state += $" ({zone.RealDifficulty.ToString().Substring(0, 1)})";
                    }
                }
            }
            else if (hasActivePlanet && !hasActiveZone)
            {
                state = $"Planet {playerInfo.ActivePlanet}";
            }
            return(state);
        }
        protected override string FormatDetails(PlayerInfoResponse playerInfo, DiscordPresence presence)
        {
            var details = $"Level {playerInfo.Level}";

            if (long.TryParse(playerInfo.Score, out long xp))
            {
                details += $" - {xp.ToString("#,##0", CultureInfo.InvariantCulture)} XP";
            }
            return(details);
        }
        protected override Assets GetAssets(PlayerInfoResponse playerInfoResponse, DiscordPresence presence)
        {
            string smallImageKey  = null;
            string smallImageText = null;

            switch (playerInfoResponse.Level)
            {
            case var level when level > 0 && level < 6:
                smallImageKey  = "badge1";
                smallImageText = "Rank 1";
                break;

            case var level when level >= 6 && level < 9:
                smallImageKey  = "badge2";
                smallImageText = "Rank 2";
                break;

            case var level when level >= 9 && level < 11:
                smallImageKey  = "badge3";
                smallImageText = "Rank 3";
                break;

            case var level when level >= 11 && level < 16:
                smallImageKey  = "badge4";
                smallImageText = "Rank 4";
                break;

            case var level when level >= 16 && level < 21:
                smallImageKey  = "badge5";
                smallImageText = "Rank 5";
                break;

            case var level when level >= 21:
                smallImageKey  = "badge6";
                smallImageText = "Rank 6";
                break;
            }
            return(new Assets
            {
                SmallImageKey = smallImageKey,
                SmallImageText = smallImageText,
                LargeImageKey = !string.IsNullOrWhiteSpace(playerInfoResponse.ActiveBossGame) ? "logo_boss" : "logo_large",
                LargeImageText = "Steam Summer Saliens"
            });
        }
示例#4
0
        public virtual RichPresence FormatPresence(PlayerInfoResponse playerInfo, DiscordPresence presence)
        {
            if (playerInfo == null)
            {
                throw new ArgumentNullException(nameof(playerInfo));
            }
            if (presence == null)
            {
                throw new ArgumentNullException(nameof(presence));
            }

            return(new RichPresence
            {
                Details = this.FormatDetails(playerInfo, presence),
                State = this.FormatState(playerInfo, presence),
                Timestamps = this.FormatTimestamps(playerInfo, presence),
                Assets = this.GetAssets(playerInfo, presence)
            });
        }
        protected override Timestamps FormatTimestamps(PlayerInfoResponse playerInfo, DiscordPresence presence)
        {
            bool hasActivePlanet   = !string.IsNullOrWhiteSpace(playerInfo.ActivePlanet);
            bool hasActiveBossZone = !string.IsNullOrWhiteSpace(playerInfo.ActiveBossGame);

            if (hasActivePlanet && hasActiveBossZone)
            {
                return(new Timestamps
                {
                    Start = (DateTime.Now - playerInfo.TimeInZone).ToUniversalTime()
                });
            }

            if (hasActivePlanet)
            {
                return(new Timestamps
                {
                    Start = (DateTime.Now - playerInfo.TimeOnPlanet).ToUniversalTime()
                });
            }
            return(null);
        }
示例#6
0
 protected abstract Assets GetAssets(PlayerInfoResponse playerInfoResponse, DiscordPresence presence);
示例#7
0
 protected abstract Timestamps FormatTimestamps(PlayerInfoResponse playerInfo, DiscordPresence presence);
示例#8
0
 protected abstract string FormatState(PlayerInfoResponse playerInfo, DiscordPresence presence);
示例#9
0
 public virtual void SetSaliensPlayerState(PlayerInfoResponse playerInfo) =>
 this.presence?.SetSaliensPlayerState(playerInfo);
        protected override Timestamps FormatTimestamps(PlayerInfoResponse playerInfo, DiscordPresence presence)
        {
            bool hasActivePlanet   = !string.IsNullOrWhiteSpace(playerInfo.ActivePlanet);
            bool hasActiveZone     = !string.IsNullOrWhiteSpace(playerInfo.ActiveZonePosition);
            bool hasActiveBossZone = !string.IsNullOrWhiteSpace(playerInfo.ActiveBossGame);

            Timestamps timestamps = null;

            if (!hasActiveBossZone)
            {
                if (hasActivePlanet && hasActiveZone &&
                    long.TryParse(playerInfo.Score, out long xp) &&
                    long.TryParse(playerInfo.NextLevelScore, out long nextLevelXp))
                {
                    if (xp > this.LastXp)
                    {
                        if (this.LastXp > 0 && this.MeasureStartTime.Ticks > 0)
                        {
                            int diffXp   = (int)(xp - this.LastXp);
                            var diffTime = DateTime.Now - this.MeasureStartTime - playerInfo.TimeInZone;
                            var eta      = TimeSpan.FromSeconds(diffTime.TotalSeconds * ((double)(nextLevelXp - xp) / diffXp));
                            this.PredictedLevelUpDate = DateTime.Now + eta - playerInfo.TimeInZone;
                        }
                        this.MeasureStartTime = DateTime.Now - playerInfo.TimeInZone;
                    }
                    this.LastXp = xp;
                }
                else if (string.IsNullOrWhiteSpace(playerInfo.NextLevelScore))
                {
                    this.PredictedLevelUpDate = DateTime.Now;
                }

                // Only show when it's less than a day: Discord doesn't show days
                if (this.PredictedLevelUpDate > DateTime.Now && this.PredictedLevelUpDate < DateTime.Now.AddDays(1))
                {
                    timestamps = new Timestamps {
                        End = this.PredictedLevelUpDate.ToUniversalTime()
                    }
                }
                ;
            }

            // Fallbacks
            if (timestamps == null && hasActivePlanet && (hasActiveZone || hasActiveBossZone))
            {
                timestamps = new Timestamps {
                    Start = (DateTime.Now - playerInfo.TimeInZone).ToUniversalTime()
                }
            }
            ;

            if (timestamps == null && hasActivePlanet)
            {
                timestamps = new Timestamps {
                    Start = (DateTime.Now - playerInfo.TimeOnPlanet).ToUniversalTime()
                }
            }
            ;

            if (hasActivePlanet && hasActiveZone)
            {
                this.MeasureStartTime = DateTime.Now - playerInfo.TimeInZone;
            }

            return(timestamps);
        }
    }
}
 protected override Timestamps FormatTimestamps(PlayerInfoResponse playerInfo, DiscordPresence presence)
 {
     return(null);
 }