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); } }); } }
private void InitTestDb() { if (!File.Exists("Gateway.sqlite")) { using (var db = new DBGateway()) db.CreateTable <Character>(); } }
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); } }
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); }
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); }
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); }
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); } }
protected override void CreateProcedure(IDbConnectionProvider connection) { dbGateway = new DBGateway(connection); }