Exemplo n.º 1
0
        private void DbSetMetaEventStatus(MetaEventStatus status, IDbTransaction tx = null)
        {
            IDbCommand cmd = m_DbConn.CreateCommand();

            if (tx != null)
            {
                cmd.Connection  = m_DbConn;
                cmd.Transaction = tx;
            }

            try
            {
                cmd.CommandText = @"INSERT OR REPLACE INTO eventtimerapi_events (id, name, mincountdown, maxcountdown, stageid, stagename, stagetype, timestamp)
                                        VALUES (@id, @name, @mincountdown, @maxcountdown, @stageid, @stagename, @stagetype, @timestamp)";
                cmd.AddParameter("@id", status.Id);
                cmd.AddParameter("@name", status.Name);
                cmd.AddParameter("@mincountdown", status.MinCountdown);
                cmd.AddParameter("@maxcountdown", status.MaxCountdown);
                cmd.AddParameter("@stageid", status.StageId);
                cmd.AddParameter("@stagename", status.StageName);
                cmd.AddParameter("@stagetype", status.StageType);
                cmd.AddParameter("@timestamp", status.Timestamp);
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                LOGGER.Error(string.Format("Exception thrown when attempting to set event data [{0}]", status.Id), e);
            }
        }
Exemplo n.º 2
0
        private MetaEventStatus DbGetMetaEventStatus(string id)
        {
            MetaEvent meta = MetaEventDefinitions.MetaEvents.Where(m => m.Id == id).FirstOrDefault();

            if (meta == null)
            {
                throw new KeyNotFoundException(string.Format("Meta event [{0}] does not exist", id));
            }

            MetaEventStatus status = new MetaEventStatus()
            {
                Id            = meta.Id,
                Name          = meta.Name,
                Countdown     = 0,
                StageId       = -1,
                StageTypeEnum = MetaEventStage.StageType.Reset,
                StageName     = null,
                Timestamp     = DbGetTimestamp()
            };

            IDbCommand cmd = m_DbConn.CreateCommand();

            try
            {
                cmd.CommandText = "SELECT * FROM eventtimerapi_events WHERE id = @id";
                cmd.AddParameter("@id", id);
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        status.Id           = reader["id"].ToString();
                        status.Name         = reader["name"].ToString();
                        status.MinCountdown = uint.Parse(reader["mincountdown"].ToString());
                        status.MaxCountdown = uint.Parse(reader["maxcountdown"].ToString());
                        status.StageId      = int.Parse(reader["stageid"].ToString());
                        status.StageName    = reader["stagename"].ToString();
                        status.StageType    = reader["stagetype"].ToString();
                        status.Timestamp    = long.Parse(reader["timestamp"].ToString());
                    }
                }
            }
            catch (Exception e)
            {
                LOGGER.Error(string.Format("Exception thrown when attempting to get event data [{0}]", id), e);
            }

            return(status);
        }
Exemplo n.º 3
0
        public static void WorkerThread(object sender, ElapsedEventArgs e)
        {
            // attempt to set the sync, if another of us is running, just exit
            if (Interlocked.CompareExchange(ref m_TimerSync, 1, 0) != 0)
            {
                return;
            }

            // wrap in a try-catch so we can release our interlock if something fails
            try
            {
                EventsResponse response = new EventsRequest(1007).Execute();

                long timestamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds;

                HashSet <EventState> metaEvents = new HashSet <EventState>(response.Events.Where(es => MetaEventDefinitions.EventList.Contains(es.EventId)));

                foreach (MetaEvent meta in MetaEventDefinitions.MetaEvents)
                {
                    if (m_EventStatus.ContainsKey(meta.Id))
                    {
                        int stageId = meta.GetStageId(metaEvents, m_EventStatus[meta.Id].StageId);

                        MetaEventStatus oldevs = m_EventStatus[meta.Id];
                        MetaEventStatus newevs = new MetaEventStatus()
                        {
                            Id            = meta.Id,
                            StageId       = stageId,
                            StageTypeEnum = (stageId >= 0 ? meta.Stages.ElementAt(stageId).Type : MetaEventStage.StageType.Invalid),
                            Timestamp     = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds
                        };

                        if (stageId < 0 && oldevs.StageId >= 0)
                        {
                            newevs.StageName = meta.Stages.ElementAt(oldevs.StageId).IsFailed(metaEvents).ToString();
                        }

                        if (oldevs.StageTypeEnum == MetaEventStage.StageType.Invalid &&
                            newevs.StageTypeEnum != MetaEventStage.StageType.Invalid)
                        {
                            DateTime epoch   = new DateTime(1970, 1, 1);
                            DateTime oldTIme = epoch.AddMilliseconds((double)oldevs.Timestamp);
                            DateTime newTIme = epoch.AddMilliseconds((double)newevs.Timestamp);

                            EventSpawnData spawnData = new EventSpawnData()
                            {
                                ev_id      = meta.Id,
                                spawn_time = newTIme - oldTIme,
                                failed     = oldevs.StageName
                            };

                            m_Data.Add(spawnData);
                        }

                        if (oldevs.StageId != newevs.StageId)
                        {
                            m_EventStatus[meta.Id] = newevs;
                        }
                    }
                }
            }
            catch (Exception)
            { }

            // reset sync to 0
            Interlocked.Exchange(ref m_TimerSync, 0);
        }
Exemplo n.º 4
0
        protected override EventScheduleResponse GetData(IDictionary <string, string> _get)
        {
            DateTime timestamp           = DateTime.UtcNow;
            uint     slot_secs_remaining = 900 - ((uint)Math.Floor(timestamp.TimeOfDay.TotalSeconds) % 900);

            int slot = MetaEventSchedule.GetSlot(timestamp);

            EventScheduleResponse data = new EventScheduleResponse()
            {
                Timestamp = (long)(timestamp - new DateTime(1970, 1, 1)).TotalMilliseconds,
                Events    = new List <MetaEventStatus>()
            };

            SortedDictionary <int, string> meta_slot_order = new SortedDictionary <int, string>();

            foreach (string meid in MetaEventSchedule.MetaEventList)
            {
                if (meid == null)
                {
                    continue;
                }

                int meta_slot = -1;

                for (int i = slot; meta_slot < 0; i++)
                {
                    if (MetaEventSchedule.MetaEventRotation[i % MetaEventSchedule.MetaEventRotation.Length] == meid)
                    {
                        meta_slot = i;
                    }
                }

                meta_slot_order.Add(meta_slot, meid);
            }

            foreach (KeyValuePair <int, string> entry in meta_slot_order)
            {
                int meta_slot = entry.Key;

                MetaEvent meta = MetaEventDefinitions.MetaEvents.Where(me => me.Id == entry.Value).First();

                MetaEventStatus status = new MetaEventStatus()
                {
                    Id           = meta.Id,
                    Name         = meta.Name,
                    MinCountdown = 0,
                    MaxCountdown = 0,
                    StageId      = -1,
                    StageType    = null,
                    StageName    = null,
                    Timestamp    = data.Timestamp
                };

                if (meta_slot == slot)
                {
                    status.StageId       = 2;
                    status.StageTypeEnum = MetaEventStage.StageType.Boss;
                    status.StageName     = "This boss is currently active.";
                    status.Countdown     = slot_secs_remaining;
                }
                else if (meta_slot == slot + 1)
                {
                    status.StageId       = 1;
                    status.StageTypeEnum = MetaEventStage.StageType.PreEvent;
                    status.StageName     = "This boss is on deck.";
                    status.Countdown     = slot_secs_remaining;
                }
                else
                {
                    status.StageId       = 0;
                    status.StageTypeEnum = MetaEventStage.StageType.Invalid;
                    status.StageName     = "This boss is on cooldown.";
                    status.Countdown     = ((uint)(meta_slot - (slot + 1)) * 900) + slot_secs_remaining;
                }

                data.Events.Add(status);
            }

            return(data);
        }
Exemplo n.º 5
0
        public void Process(EventsResponse events)
        {
            long timestamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds;

            HashSet <EventState> metaEvents = new HashSet <EventState>(events.Events.Where(es => es.WorldId == WORLD_ID && MetaEventDefinitions.EventList.Contains(es.EventId)));

            HashSet <MetaEventStatus> changedStatuses = new HashSet <MetaEventStatus>();

            // discover meta-event states
            foreach (MetaEvent meta in MetaEventDefinitions.MetaEvents)
            {
                MetaEventStatus oldStatus = DbGetMetaEventStatus(meta.Id);
                int             stageId   = meta.GetStageId(metaEvents, oldStatus.StageId);

                // stock state
                MetaEventStatus status = new MetaEventStatus()
                {
                    Id           = meta.Id,
                    Name         = meta.Name,
                    MinCountdown = meta.MinSpawn,
                    MaxCountdown = meta.MaxSpawn,
                    StageId      = stageId,
                    StageType    = null,
                    StageName    = null,
                    Timestamp    = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds
                };

                // we're in a stage
                if (stageId >= 0)
                {
                    MetaEventStage stage = meta.Stages.ElementAt(stageId);

                    if (stage.Countdown > 0 && stage.Countdown != uint.MaxValue)
                    {
                        status.Countdown = stage.Countdown;
                    }
                    else
                    {
                        status.Countdown = 0;
                    }

                    status.StageName     = stage.Name;
                    status.StageTypeEnum = stage.Type;
                }

                // has the status changed?
                if (oldStatus.StageId != status.StageId || (stageId >= 0 && oldStatus.StageName != status.StageName))
                {
                    // if the actual stage hasn't changed (multiline scenareo) then don't update the timestamp
                    if (oldStatus.StageId == status.StageId)
                    {
                        status.Timestamp = oldStatus.Timestamp;
                    }

                    changedStatuses.Add(status);
                }
            }

            if (changedStatuses.Count > 0)
            {
                LOGGER.DebugFormat("Saving {0} updated event status(es)", changedStatuses.Count);

                IDbTransaction tx = m_DbConn.BeginTransaction();

                try
                {
                    DbSetProperty("timestamp", timestamp.ToString(), tx);

                    foreach (MetaEventStatus status in changedStatuses)
                    {
                        DbSetMetaEventStatus(status, tx);
                    }

                    tx.Commit();
                }
                catch (Exception e)
                {
                    LOGGER.Error("Exception thrown when attempting to update event status", e);

                    try
                    {
                        tx.Rollback();
                    }
                    catch (Exception ex)
                    {
                        LOGGER.Error("Exception thrown when attempting to roll back event status update", ex);
                    }
                }
            }
        }
Exemplo n.º 6
0
        public void SetData(MetaEventStatus e)
        {
            EventName.Text = e.Name;

            DateTime then = new DateTime(1970, 1, 1).AddMilliseconds(e.Timestamp);
            TimeSpan span = DateTime.UtcNow - then;

            m_Countdown = false;

            string windowType = null;

            if (e.MinCountdown > 0)
            {
                m_Countdown = true;

                if (e.MinCountdown - span.TotalSeconds > 0)
                {
                    span = new TimeSpan(0, 0, (int)e.MinCountdown) - span;
                }
                else
                {
                    if (e.MaxCountdown - span.TotalSeconds > 0)
                    {
                        windowType = "window";
                        span       = new TimeSpan(0, 0, (int)e.MaxCountdown) - span;
                    }
                    else
                    {
                        m_Countdown = false;
                        windowType  = "behind";
                        span       -= new TimeSpan(0, 0, (int)Math.Max(e.MinCountdown, e.MaxCountdown));
                    }
                }
            }

            m_EventTime = span;

            Visibility = Visibility.Visible;

            if (e.StageTypeEnum == MetaEventStage.StageType.Boss)
            {
                Background = BOSS_GRADIENT;
            }
            else if (e.StageTypeEnum == MetaEventStage.StageType.PreEvent)
            {
                Background = PRE_GRADIENT;
            }
            else
            {
                Background = null;

                if (windowType == "window")
                {
                    EventTime.Foreground = Brushes.Blue;
                }
                else if (windowType == "behind")
                {
                    EventTime.Foreground = Brushes.Red;
                }
                else
                {
                    EventTime.Foreground = null;
                    Visibility           = Visibility.Collapsed;
                }
            }

            if (e.StageId < 0)
            {
                TimeSpan window = new TimeSpan(0, 0, (int)(e.MaxCountdown - e.MinCountdown));

                if (windowType == "behind")
                {
                    EventInfo.Text = "Time Event has been Outdated";
                }
                else if (windowType == "window")
                {
                    EventInfo.Text = string.Format("{0}{1}Spawning Window",
                                                   (window.Hours > 0 ? string.Format("{0} Hour ", window.Hours) : string.Empty),
                                                   (window.Minutes > 0 ? string.Format("{0} Minute ", window.Minutes) : string.Empty));
                }
                else
                {
                    EventInfo.Text = string.Empty;
                }
            }
            else
            {
                EventInfo.Text = e.StageName;
            }
        }