/// <summary> /// 采用两个实体比较对象按照某种比较逻辑进行处理,构造一个新的实体比较对象 /// </summary> /// <seealso cref="http://www.cnblogs.com/bluedoctor/archive/2010/11/28/1870095.html"/> /// <param name="compare1">比较逻辑符号左边的实体比较对象</param> /// <param name="logic">比较逻辑</param> /// <param name="compare2">比较逻辑符号左边的实体比较对象</param> public OQLCompare(OQLCompare compare1, CompareLogic logic, OQLCompare compare2) { //propertyList.AddRange(compare1.propertyList); //compareValueList.AddRange(compare1.compareValueList); //compareTypeList.AddRange(compare1.compareTypeList); //propertyList.AddRange(compare2.propertyList); //compareValueList.AddRange(compare2.compareValueList); //compareTypeList.AddRange(compare2.compareTypeList); //compareLogicStrList.AddRange(compare1.compareLogicStrList); dictionaryAddRange(compareValueList, compare1.compareValueList); dictionaryAddRange(compareValueList, compare2.compareValueList); switch (logic) { case CompareLogic.AND: //this.compareLogicStrList.Add(" AND "); this.CompareString = " (" + compare1.CompareString + " AND " + compare2.CompareString + ") "; break; case CompareLogic.OR: //this.compareLogicStrList.Add(" OR "); this.CompareString = " (" + compare1.CompareString + " OR " + compare2.CompareString + ") "; break; //case CompareLogic.NOT : // this.compareLogicStrList.Add(" NOT "); // this.CompareString = " NOT (" + compare1.CompareString + " AND " + compare2.CompareString + ") "; // break; } }
public void Cleanup() { _compare = null; }
/// <summary> /// 对一组OQLCompare 对象,执行CompareLogic 类型的比较,通常用于构造复杂的带括号的条件查询 /// </summary> /// <seealso cref="http://www.cnblogs.com/bluedoctor/archive/2011/02/24/1963606.html"/> /// <param name="compares">OQL比较对象列表</param> /// <param name="logic">各组比较条件的组合方式,And,Or,Not</param> /// <returns>新的条件比较对象</returns> public OQLCompare Comparer(List<OQLCompare> compares, CompareLogic logic) { if (compares == null || compares.Count == 0) throw new Exception("OQL 条件比较对象集合不能为空或者空引用!"); if (compares.Count == 1) return compares[0]; OQLCompare cmp = new OQLCompare(); string typeString = logic == CompareLogic.AND ? " And " : logic == CompareLogic.OR ? " Or " : " Not "; foreach (OQLCompare item in compares) { cmp.CompareString += item.CompareString + typeString; if (item.ComparedParameters != null) foreach (string key in item.ComparedParameters.Keys) { cmp.ComparedParameters.Add(key, item.ComparedParameters[key]); } } cmp.CompareString = cmp.CompareString.Substring(0, cmp.CompareString.Length - typeString.Length); cmp.CompareString = " ( " + cmp.CompareString + " ) "; return cmp; }
public void Initialize() { _compare = new CompareLogic(); }
public async Task CharacterCard_Should_BeProperlyExportedAndImported() { var investigatorData = new InvestigatorData { Name = "Elisabeth Grimaldi", Player = "Lao", Occupation = new Occupation { Name = "Badacz" }, Age = 26, Gender = Gender.Female, PlaceOfResidence = "Paryż", PlaceOfBirth = "Londyn" }; var characteristics = new Characteristics { Strength = 45, Constitution = 70, Size = 71, Dexterity = 45, Appearance = 60, Intelligence = 55, Power = 55, Education = 65, HitPoints = 14, Luck = 55, MagicPoints = 11 }; var weapons = new System.Collections.ObjectModel.ObservableCollection <Weapon> { new Weapon { Name = "Średni nóż", Damage = "1D4 + 2 + MO", NumberOfAttacks = "1" } }; var history = new InvestigatorHistory { CharacterDescription = "Śliczna" + "Nieśmiała" + "Elegancka", IdeologyAndBeliefs = "Polityka - liberalizm", ImportantPeople = "Nauczyciel medycyny - Emmet Harding" + "ubóstwiam tą osobę za jej niesamowitą inteligencję", ImportantPlaces = "Wieża Eiffela", PersonalThings = "Okrągła, walcowata tuba bez otworu znaleziona pod wejściem do windy wieży Eiffela", Qualities = "Lojalność", InjuriesScars = "10cm blizna na prawej łopatce" }; var belongings = new Belongings { Equipment = new System.Collections.Generic.List <string> { "Książki historyczne", "Średni nóż" }, ExpenditureLevel = 10, Cash = 60, Possesions = new System.Collections.Generic.Dictionary <string, int> { { "mieszkanie w Paryżu", 1500 } } }; var relations = new System.Collections.ObjectModel.ObservableCollection <Relations> { new Relations { Investigator = "Hudson Caffey", Player = "Jasiu", Relation = "kolega, poznany przez Howarda Barnhama" }, new Relations { Investigator = "Mortimer Caffey", Player = "Gerard", Relation = "kolega, poznany przez Howarda Barnhama" }, new Relations { Investigator = "Howard Barnham", Player = "Bartek", Relation = "Poznany 5 lat temu na bankiecie, dobry przyjaciel" } }; var sut = CharacterCard.Create(investigatorData, characteristics, new System.Collections.ObjectModel.ObservableCollection <Skill>(), weapons, history, belongings, relations); await sut.InitializeAsync(); await sut.ExportAsync("CharacterCard.json"); var newSut = new CharacterCard(); await newSut.ImportAsync("CharacterCard.json"); var compareLogic = new CompareLogic(); var result = compareLogic.Compare(sut, newSut); Assert.IsTrue(result.AreEqual); }
/// <summary> /// Create a channel instance /// <param name="config">Channel config information</param> /// </summary> public ChannelInstance(ChannelConfig config, ChannelState state) { ChannelState = state; Config = config; _log = LogManager.GetLogger(config.Channel); Chat = new ChatController(config.TwitchAuth); Dota = new DotaBot(config.DotaAuth); _lobbyManageTimer = new Timer(5000); _lobbyManageTimer.Stop(); _lobbyManageTimer.Elapsed += UpdateLobbyState; _state = new StateMachine <State, Trigger>(State.SignedOff); _state.OnTransitioned((transition => { _log.DebugFormat("{0} => {1}", transition.Source.ToString("G"), transition.Destination.ToString("G")); })); _state.Configure(State.Conceived) .Permit(Trigger.DisconnectRequested, State.SignedOff); _state.Configure(State.SignedOff) .SubstateOf(State.Conceived) .OnEntry(() => Task.Run(() => Dota.Stop())) .OnEntry(() => Task.Run(() => Chat.Stop())) .Ignore(Trigger.ChatbotsUnready) .Permit(Trigger.ConnectRequested, State.Connecting); _state.Configure(State.Connecting) .SubstateOf(State.Conceived) .OnEntry(() => Task.Run(() => Dota.Start())) .OnEntry(() => Task.Run(() => Chat.Start())) .Ignore(Trigger.ConnectRequested) .Ignore(Trigger.ChatbotsUnready) .Permit(Trigger.ChatbotsReady, State.Ready); _state.Configure(State.Ready) .SubstateOf(State.Conceived) .Ignore(Trigger.ChatbotsReady) .OnEntry(() => _log.Debug("Ready")) .PermitDynamic(Trigger.DotaEnteredLobby, () => Dota.IsLobbyHost ? State.ManageLobby : State.AcquireOwnershipLobby) .OnEntryFrom(Trigger.LobbyDeleteRequsted, () => { Dota.LeaveLobby(true); }); _state.Configure(State.DotaLobby) .SubstateOf(State.Ready) .Permit(Trigger.DotaLostLobby, State.Ready) .Permit(Trigger.LobbyDeleteRequsted, State.Ready); _state.Configure(State.AcquireOwnershipLobby) .SubstateOf(State.DotaLobby) .Permit(Trigger.LobbyBecameOwner, State.ManageLobby) .OnEntry(RequestLobbyOwnership); _state.Configure(State.ManageLobby) .SubstateOf(State.DotaLobby) .OnEntry(VerifyLobby) .OnEntry(() => SendHelp()); _state.Configure(State.LobbyPlay) .SubstateOf(State.DotaLobby) .OnEntry(() => _log.Debug("DOTA started playing.")) .OnEntry(() => Dota.LeaveLobby()); Dota.StateTransitioned += (sender, transition) => CheckBotStates(); Dota.LobbyInviteReceived += (sender, invite) => { if (invite.sender_id == Config.OwnerSteamId) { _log.Debug("Received lobby invite from owner, accepting."); Dota.DotaGcHandler.RespondLobbyInvite(invite.group_id); return; } _log.Warn("Received lobby invite from unknown user, declining."); Dota.DotaGcHandler.RespondLobbyInvite(invite.group_id, false); }; Dota.PartyInviteReceived += (sender, invite) => { if (invite.sender_id == Config.OwnerSteamId) { _log.Debug("Received party invite from owner, accepting."); Dota.DotaGcHandler.RespondPartyInvite(invite.group_id); return; } _log.Warn("Received party invite from unknown user, declining."); Dota.DotaGcHandler.RespondPartyInvite(invite.group_id, false); }; Dota.LobbyUpdate += (sender, lobby) => { if (lobby == null) { return; } if (_state.CanFire(Trigger.LobbyBecameOwner) && Dota.IsLobbyHost) { _state.Fire(Trigger.LobbyBecameOwner); } var logic = new CompareLogic(new ComparisonConfig() { MaxDifferences = int.MaxValue }); var compare = logic.Compare(lobby, Dota.Lobby); _log.Debug(compare.DifferencesString); if (State == State.ManageLobby) { } }; Dota.JoinedLobbyChat += (sender, args) => { if (_state.CanFire(Trigger.LobbyBecameOwner)) { var owner = Dota.DotaGcHandler.Lobby.members.FirstOrDefault(m => m.id == Dota.Lobby.leader_id); if (owner == null) { _log.Error("There is no owner for this lobby?"); return; } var msg = "Hey, " + owner.name + ", please set me as Lobby Host so I can invite people."; Dota.SendLobbyMessage(msg); if (Dota.SteamFriends.GetFriendRelationship(new SteamID(owner.id)) == EFriendRelationship.Friend) { Dota.SteamFriends.SendChatMessage(new SteamID(owner.id), EChatEntryType.ChatMsg, msg); } } }; }
/// <summary> /// Static contstructor to initialise compareLogic. /// </summary> static ClientUtils() { compareLogic = new CompareLogic(); }
public MessageEqualityComparer() { _compareLogic = new CompareLogic { Config = { TreatStringEmptyAndNullTheSame = true, MaxDifferences = 50 } }; }