Exemple #1
0
        private void retrieveJumpTimes()
        {
            List <int> meetingIds = new List <int>();

            racesStatus.ForEach(r =>
            {
                if (!meetingIds.Contains(r.MeetingId))
                {
                    meetingIds.Add(r.MeetingId);
                }
            });

            if (meetingIds.Count() > 0)
            {
                var jumpTimes = DBGateway.GetJumpTimes(meetingIds);

                racesStatus.ForEach(r =>
                {
                    var jtLocal = jumpTimes.FirstOrDefault(jt => jt.MeetingId == r.MeetingId && jt.RaceNumber == r.RaceNumber);
                    if (jtLocal != null && jtLocal.LocalJumpTime != null)
                    {
                        DateTime dt   = r.DateUTC + jtLocal.LocalJumpTime;
                        r.JumpTimeUTC = TimeZoneHelper.ToUTC(dt, r.AUS_StateId);
                    }
                });
            }
        }
Exemple #2
0
 private void InitTestDb()
 {
     if (!File.Exists("Gateway.sqlite"))
     {
         using (var db = new DBGateway())
             db.CreateTable <Character>();
     }
 }
Exemple #3
0
        private bool loadRaceCodes()
        {
            try
            {
                //race codes are assumed to have been preloaded in DB
                var dbMeetings = DBGateway.GetUpcomingMeetings(CountryCode).ToList();

                Log.Instance.Debug(Name + ": Retrieved " + dbMeetings.Count() + " upcoming meetings");

                dbMeetings.ForEach(db =>
                {
                    //it is a new meeting --> add all its races
                    for (int i = 0; i < db.NumberOfRaces; i++)
                    {
                        var raceNum = i + 1;
                        var memRace = racesStatus.FirstOrDefault(mem => mem.MeetingId == db.MeetingId && mem.RaceNumber == raceNum);
                        if (memRace == null)
                        {
                            //create one entry per race
                            racesStatus.Add(new RaceStatus
                            {
                                MeetingId   = db.MeetingId,
                                MeetingCode = db.MeetingCode,
                                DateUTC     = db.MeetingDate,
                                AUS_StateId = db.AUS_StateId,
                                RaceNumber  = raceNum
                            });
                        }
                        else
                        {
                            //update existing entry
                            //memRace.MeetingId = db.MeetingId;
                            memRace.MeetingCode = db.MeetingCode;
                            memRace.DateUTC     = db.MeetingDate;
                            memRace.AUS_StateId = db.AUS_StateId;
                            //memRace.RaceNumber = raceNum;
                        }
                    }
                });

                //unload old races from memory: those that are not being retrieved from db anymore and are old
                racesStatus.RemoveAll(mem => !dbMeetings.Exists(db => db.MeetingId == mem.MeetingId) &&
                                      mem.DateUTC < DateTime.UtcNow.Date);

                //in HK, jump times are not in the XMLs, so they are retrieved from DB
                retrieveJumpTimes();

                return(true);
            }
            catch (Exception e)
            {
                Log.Instance.ErrorException(Name + ": failed to load upcoming meetings from DB", e);
                return(false);
            }
        }
Exemple #4
0
        public static bool HandleCharCreate(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse <CMSG_CHAR_CREATE>(br);

            pkt.Name = pkt.Name.UppercaseFirst();

            using (var db = new DBGateway())
            {
                // TODO: If PvP-server, make sure same-faction
                // TODO: Check for reserved names

                // Check if name already is taken
                if (db.Character.Count(c => c.Name == pkt.Name) > 0)
                {
                    client.SendPacket(WorldOpcodes.SMSG_CHAR_CREATE, PacketHelper.Build(new SMSG_CHAR_CREATE {
                        Code = CharacterCreationCode.NameInUse
                    }));
                    return(true);
                }

                db.Insert(new Character
                {
                    AccountID = client.AccountID,

                    Name       = pkt.Name,
                    Race       = (byte)pkt.Race,
                    Class      = (byte)pkt.Class,
                    Gender     = (byte)pkt.Gender,
                    Skin       = pkt.Skin,
                    Face       = pkt.Face,
                    HairStyle  = pkt.HairStyle,
                    HairColor  = pkt.HairColor,
                    FacialHair = pkt.FacialHair,

                    Level = 1,
                    // TODO: Get spawn information based on race
                    Zone = 12,
                    Map  = 0,
                    X    = -8954.42f,
                    Y    = -158.558f,
                    Z    = 81.8225f,

                    GuildId        = 0,     // New characters don't have guilds!
                    CharacterFlags = 0,
                    FirstLogin     = false, //TODO: set true
                });
            }

            client.SendPacket(WorldOpcodes.SMSG_CHAR_CREATE, PacketHelper.Build(new SMSG_CHAR_CREATE {
                Code = CharacterCreationCode.Success
            }));
            return(true);
        }
Exemple #5
0
        public static bool HandleCharDelete(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse <CMSG_CHAR_DELETE>(br);

            using (var db = new DBGateway())
            {
                db.Character.Delete(c => c.CharacterID == pkt.GUID);
            }

            client.SendPacket(WorldOpcodes.SMSG_CHAR_DELETE, PacketHelper.Build(new SMSG_CHAR_DELETE {
                Code = CharacterDeleteCode.Success
            }));

            return(true);
        }
Exemple #6
0
        public static bool HandleCharEnum(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse <CMSG_CHAR_ENUM>(br);

            // TODO: Move to gateway service?

            using (var db = new DBGateway())
            {
                var dbCharacters = db.Character.Where(c => c.AccountID == client.AccountID);
                if (dbCharacters.Count() == 0)
                {
                    client.SendPacket(WorldOpcodes.SMSG_CHAR_ENUM, PacketHelper.Build(new SMSG_CHAR_ENUM {
                        Length = 0
                    }));
                    return(true);
                }

                var characters = new List <CharEnumEntry>();
                foreach (var character in dbCharacters)
                {
                    var gameChar = new CharEnumEntry
                    {
                        GUID = character.CharacterID,

                        Name       = character.Name,
                        Race       = (WoWRace)character.Race,
                        Class      = (WoWClass)character.Class,
                        Gender     = (WoWGender)character.Gender,
                        Skin       = character.Skin,
                        Face       = character.Face,
                        HairStyle  = character.HairStyle,
                        HairColor  = character.HairColor,
                        FacialHair = character.FacialHair,

                        Level = character.Level,
                        Zone  = character.Zone,
                        Map   = character.Zone,
                        X     = character.X,
                        Y     = character.Y,
                        Z     = character.Z,

                        GuildId        = character.GuildId,
                        CharacterFlags = character.CharacterFlags,
                        FirstLogin     = (byte)(character.FirstLogin ? 1 : 0),

                        // TODO: Get rest from database
                        PetDisplayId = 0,
                        PetLevel     = 0,
                        PetFamily    = 0,

                        Equipment             = new CharEnumEquipmentEntry[(int)WoWEquipSlot.Tabard + 1],
                        FirstBagDisplayId     = 0,
                        FirstBagInventoryType = 0,
                    };

                    for (int i = (int)WoWEquipSlot.Head; i < (int)WoWEquipSlot.Tabard + 1; i++)
                    {
                        gameChar.Equipment[i] = new CharEnumEquipmentEntry {
                            DisplayInfoId = 0, InventoryType = 0
                        }
                    }
                    ;

                    characters.Add(gameChar);
                }

                client.SendPacket(WorldOpcodes.SMSG_CHAR_ENUM, PacketHelper.Build(new SMSG_CHAR_ENUM
                {
                    Length     = (byte)characters.Count,
                    Characters = characters.ToArray(),
                }));
            }

            return(true);
        }
 protected override void CreateProcedure(IDbConnectionProvider connection)
 {
     dbGateway        = new DBGateway(connection);
     dbFindEdiPartner = new DBFindEdiPartner(connection);
 }
Exemple #8
0
        private void refreshRaces(List <RaceStatus> racesToRefresh)
        {
            List <Meeting>  meetings = null;
            List <Race>     races    = null;
            List <Runner>   runners  = null;
            List <RaceOdds> odds     = null;

            Exception ex     = null;
            bool      parsed = false;

            try
            {
                //parse races' XMLs
                parseRaces(racesToRefresh, out meetings, out races, out runners, out odds);
                parsed = true;
                //insert/update them in the DB
                updateRaces(meetings, races, runners, odds);
            }
            catch (Exception e)
            {
                StringBuilder msg = new StringBuilder();

                if (!parsed)
                {
                    msg.AppendLine(Name + " failed to PARSE the following data: ");
                    msg.AppendFormat("Races ({0}): [MeetingId, DateUTC, MeetingCode, AUS_StateId, RaceNumber]{1}", racesToRefresh.Count, Environment.NewLine);
                    foreach (var r in racesToRefresh)
                    {
                        msg.AppendFormat("[{0}, {1}, {2}, {3}, {4}]{5}",
                                         r.MeetingId, r.DateUTC, r.MeetingCode, r.AUS_StateId, r.RaceNumber, Environment.NewLine);
                    }
                }
                else
                {
                    msg.AppendLine(Name + " failed to UPDATE following data: ");

                    //meetings
                    if (meetings != null)
                    {
                        msg.AppendFormat("Meetings ({0}): [MeetingId, isAbandoned, MeetingDate, RacecourseName, NumberOfRaces, MeetingCode]{1}",
                                         meetings.Count, Environment.NewLine);
                        meetings.ForEach(m =>
                        {
                            msg.AppendFormat("[{0}, {1}, {2}, {3}, {4}, {5}]{6}",
                                             m.MeetingId, m.isAbandoned, m.MeetingDate, m.RacecourseName, m.NumberOfRaces, m.MeetingCode, Environment.NewLine);
                        });
                    }
                    else
                    {
                        msg.AppendLine("Meetings: NULL");
                    }

                    //races
                    if (races != null)
                    {
                        msg.AppendFormat("Races ({0}): [MeetingId, RaceNumber, RaceStatus, RaceJumpTimeUTC, CurrentRefreshInterval]{1}",
                                         races.Count, Environment.NewLine);
                        races.ForEach(r =>
                        {
                            msg.AppendFormat("[{0}, {1}, {2}, {3}, {4}]{5}",
                                             r.MeetingId, r.RaceNumber, r.RaceStatus, r.RaceJumpTimeUTC, r.CurrentRefreshInterval, Environment.NewLine);
                        });
                    }
                    else
                    {
                        msg.AppendLine("Races: NULL");
                    }

                    //runners
                    if (runners != null)
                    {
                        msg.AppendFormat("Runners ({0}): [MeetingId, RaceNumber, HorseNumber, isScratched, WinOdds, Placeodds]{1}",
                                         runners.Count, Environment.NewLine);
                        runners.ForEach(r =>
                        {
                            msg.AppendFormat("[{0}, {1}, {2}, {3}, {4}, {5}]{6}",
                                             r.MeetingId, r.RaceNumber, r.HorseNumber, r.isScratched, r.WinOdds, r.Placeodds, Environment.NewLine);
                        });
                    }
                    else
                    {
                        msg.AppendLine("Runners: NULL");
                    }

                    //odds
                    if (odds != null)
                    {
                        msg.AppendFormat("odds ({0}): [MeetingId, RaceNumber, RaceStatus] (pool and div values excluded){1}",
                                         odds.Count, Environment.NewLine);
                        odds.ForEach(o =>
                        {
                            msg.AppendFormat("[{0}, {1}, {2}]{3}",
                                             o.MeetingId, o.RaceNumber, o.RaceStatus, Environment.NewLine);
                        });
                    }
                    else
                    {
                        msg.AppendLine("Odds: NULL");
                    }
                }


                Log.Instance.ErrorException(msg.ToString(), e);
                racesToRefresh.ToList().ForEach(memRace => memRace.numErrors++);
                ex = e;
            }


            var racesToNotify = new List <RaceStatus>();

            //set jumptime
            racesToRefresh.ToList().ForEach(memRace =>
            {
                var rc = races == null ? null : races.FirstOrDefault(r =>
                                                                     r.MeetingId == memRace.MeetingId && r.RaceNumber == memRace.RaceNumber);

                //if it couldn't be retrieved, we'll add delay til its next retrieval
                if (rc == null || rc.RaceJumpTimeUTC == DateTime.MaxValue)
                {
                    memRace.numErrors++;
                }
                else
                {
                    memRace.numErrors = 0;
                    memRace.IsDone    = rc.RaceStatus == ConfigValues.RaceStatusDone ||
                                        rc.RaceStatus == ConfigValues.RaceStatusAbandoned;

                    if (memRace.NotInitialized) //first time retrieved
                    {
                        //set active time to jumptime-25
                        memRace.ActiveTimeUTC = rc.RaceJumpTimeUTC.AddSeconds(-ConfigValues.ActiveBeforeJumpTime);
                        //set finishing time to jumptime-5
                        memRace.FinishingTimeUTC = rc.RaceJumpTimeUTC.AddSeconds(-ConfigValues.FinishingBeforeJumpTime);
                    }
                }

                //after 10 errors, an email is sent to the administrator
                if (memRace.numErrors == ConfigValues.NumErrorsToSendEmail ||
                    memRace.numErrors == ConfigValues.NumErrorsToSendEmail2)
                {
                    racesToNotify.Add(memRace);
                }
            });

            //set next refresh
            setNextRefresh(racesToRefresh);

            //store the update time in DB to synchronize with the web app
            DBGateway.SetUpdateTime(racesToRefresh);

            if (racesToNotify.Count > 0)
            {
                sendErrorEmail(racesToNotify, ex);
            }
        }
Exemple #9
0
 protected override void CreateProcedure(IDbConnectionProvider connection)
 {
     dbGateway = new DBGateway(connection);
 }