Example #1
0
 private void AddToAlertPostQueue(WarframeAlert alert, bool notifyClient, bool alertHasExpired)
 {
     if (!_alertMessagePostQueue.Any(x => x.WarframeEvent.GUID == alert.GUID))
     {
         _alertMessagePostQueue.Add(new MessageQueueElement <WarframeAlert>(alert, notifyClient, alertHasExpired));
     }
 }
        //Parse the mission information into a readable presentation
        public static string DiscordMessage(this WarframeAlert alert, bool isNotification)
        {
            MissionInfo info                  = alert.MissionDetails;
            string      rewardMessage         = (!string.IsNullOrEmpty(info.Reward) ? info.Reward : string.Empty);
            string      rewardQuantityMessage = (info.RewardQuantity > 1 ? info.RewardQuantity + "x" : string.Empty);
            string      creditMessage         = (!string.IsNullOrEmpty(rewardMessage) ? ", " : string.Empty) + (info.Credits > 0 ? info.Credits + "cr" : string.Empty);

            var statusMessage = new StringBuilder();

            if (!alert.IsExpired())
            {
                if (DateTime.Now < alert.StartTime)
                {
                    statusMessage.Append($"Starts {alert.StartTime:HH:mm} ({(alert.GetMinutesRemaining(true) > 0 ? ParseMinutesAsTime(alert.GetMinutesRemaining(true), 2) : "<1m")})");
                }
                else
                {
                    statusMessage.Append($"Expires {alert.ExpireTime:HH:mm} ({(alert.GetMinutesRemaining(false) > 0 ? ParseMinutesAsTime(alert.GetMinutesRemaining(false), 2) : "<1m")})");
                }
            }
            else
            {
                statusMessage.Append($"Expired ({alert.ExpireTime:HH:mm})");
            }

            var returnMessage = new StringBuilder();
            var expireMessage = $"Expires {alert.ExpireTime:HH:mm} ({alert.GetMinutesRemaining(false)}m)";

            if (!isNotification)
            {
                returnMessage.AppendLine(alert.DestinationName);
                returnMessage.AppendLine($"{info.Faction} {info.MissionType} ({info.MinimumLevel}-{info.MaximumLevel}){(info.RequiresArchwing ? $" (Archwing)" : string.Empty)}");
                returnMessage.AppendLine($"{rewardQuantityMessage + rewardMessage + creditMessage}");
                returnMessage.Append(statusMessage.ToString());
            }
            else
            {
                returnMessage.AppendLine("New Alert");
                returnMessage.AppendLine($"{rewardQuantityMessage + rewardMessage + creditMessage}");
                returnMessage.Append(expireMessage);
            }

            return(returnMessage.ToString());
        }
Example #3
0
        public IEnumerable <WarframeAlert> GetAlerts()
        {
            JObject worldState   = _scraper.WorldState;
            var     resultAlerts = new List <WarframeAlert>();

            //Find Alerts
            foreach (var jsonAlert in worldState["Alerts"])
            {
                WarframeAlert currentAlert = _alertsList.Find(x => x.GUID == jsonAlert["_id"]["$oid"].ToString());

                if (currentAlert == null)
                {
                    string id  = jsonAlert["_id"]["$oid"].ToString();
                    string loc = jsonAlert["MissionInfo"]["location"].ToString();

                    //Loot - Can be countable (Alertium etc.) or single (Blueprints) items
                    JToken countables    = (jsonAlert["MissionInfo"]["missionReward"]["countedItems"]),
                           nonCountables = (jsonAlert["MissionInfo"]["missionReward"]["items"]);

                    var rewardStr = string.Empty;
                    var nodeName  = loc;

                    using (var unit = new UnitOfWork(new WarframeDataContext()))
                    {
                        rewardStr = (countables != null ?
                                     unit.WarframeItems.GetItemName(countables[0]["ItemType"].ToString()) :
                                     (nonCountables != null ? unit.WarframeItems.GetItemName(nonCountables[0].ToString()) : ""));

                        nodeName = unit.WFSolarNodes.GetNodeName(loc);
                    }

                    var millisecondsUntilStart  = long.Parse(jsonAlert["Activation"]["$date"]["$numberLong"].ToString()) - (long.Parse(worldState["Time"].ToString()) * TIME_TO_LONG_MULTIPLIER);
                    var millisecondsUntilExpire = long.Parse(jsonAlert["Expiry"]["$date"]["$numberLong"].ToString()) - (long.Parse(worldState["Time"].ToString()) * TIME_TO_LONG_MULTIPLIER);
                    var startTime  = DateTime.Now.AddMilliseconds(millisecondsUntilStart);
                    var expireTime = DateTime.Now.AddMilliseconds(millisecondsUntilExpire);

                    var  creditReward     = int.Parse(jsonAlert["MissionInfo"]["missionReward"]["credits"].ToString());
                    var  reqArchwingData  = jsonAlert["MissionInfo"]["archwingRequired"];
                    bool requiresArchwing = reqArchwingData != null?bool.Parse(reqArchwingData.ToString()) : false;

                    JToken rewardParam = null;
                    if (countables != null)
                    {
                        rewardParam = countables[0]["ItemType"].ToString();
                    }
                    else if (nonCountables != null)
                    {
                        rewardParam = nonCountables[0].ToString();
                    }

                    if (RewardIsNotIgnored(creditReward, (rewardParam != null) ? rewardParam.ToString() : null))
                    {
                        if (DateTime.Now < expireTime)
                        {
                            MissionInfo alertInfo = new MissionInfo(jsonAlert["MissionInfo"]["faction"].ToString(),
                                                                    jsonAlert["MissionInfo"]["missionType"].ToString(),
                                                                    creditReward,
                                                                    //If for whatever reason, an alert returns both countables and non-countables, currently only the countables will be returned.
                                                                    //In addition, if an alert returns multiple different countables, only the first instance will be returned. This affects invasions as well!
                                                                    rewardStr,
                                                                    int.Parse((countables != null ? countables[0]["ItemCount"] : 1).ToString()),
                                                                    int.Parse(jsonAlert["MissionInfo"]["minEnemyLevel"].ToString()),
                                                                    int.Parse(jsonAlert["MissionInfo"]["maxEnemyLevel"].ToString()),
                                                                    requiresArchwing);

                            currentAlert = new WarframeAlert(alertInfo, id, nodeName, startTime, expireTime);
                            _alertsList.Add(currentAlert);
#if DEBUG
                            Console.WriteLine("New Alert Event");
#endif
                        }
                    }
                }

                _alertsList.RemoveAll(x => x.ExpireTime < DateTime.Now);

                if ((currentAlert != null) && (currentAlert.ExpireTime > DateTime.Now))
                {
                    resultAlerts.Add(currentAlert);
                }
            }

            return(_alertsList);
        }