public HomeController(IPresenceManager identifier, IResidentsRepository residentsRepository) { this.identifier = identifier; this.residentsRepository = residentsRepository; identifier.PersonArrived += identifier_PersonArrived; identifier.PersonLeft += identifier_PersonLeft; registerResidents(); state = identifier.GetState(); Helper.StartRepetativeTask(HandleNewEvents, TimeSpan.FromSeconds(10)); }
public XmppSession( XmppClientEx xmppClient, IMapper mapper, MyViewModel myViewModel, Contacts contacts, IPresenceManager presenceManager, IAvatarStorage avatarStorage, IUserAvatarStorage userAvatarStorage) { this.xmppClient = xmppClient; this.mapper = mapper; this.viewModel = myViewModel; this.contacts = contacts; this.presenceManager = presenceManager; this.avatarStorage = avatarStorage; this.userAvatarStorage = userAvatarStorage; xmppClient.XmppSessionStateObserver.Subscribe(async state => { if (state == SessionState.Disconnected && SessionState != SessionState.Disconnected) { //Task.Run(() => DoReconnectAsync(Connect, TimeSpan.FromSeconds(30), 100)); } await SetSessionState(state); System.Diagnostics.Debug.WriteLine(state); }); xmppClient .XmppXElementStreamObserver .Where(el => el.OfType <MatrixPresence>() && el.Cast <MatrixPresence>().Type == MatrixPresenceType.Available && contacts.Any(c => c.Jid == el.Cast <MatrixPresence>().From.Bare) ) .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(el => { // received online presence from a contact System.Diagnostics.Debug.WriteLine($"online presence from: {el.Cast<MatrixPresence>().From}"); var pres = el.Cast <MatrixPresence>(); var contact = contacts.FirstOrDefault(ct => ct.Jid == pres.From.Bare); var viewPres = mapper.Map <ViewModel.Presence>(pres); contact.Presences.AddOrReplace(viewPres, p => p.Resource == viewPres.Resource); }); xmppClient .XmppXElementStreamObserver .Where(el => el.OfType <MatrixPresence>() && el.Cast <MatrixPresence>().Type == MatrixPresenceType.Unavailable && el.Cast <MatrixPresence>().From != null && el.Cast <MatrixPresence>().From.Resource != null && contacts.Any(c => c.Jid == el.Cast <MatrixPresence>().From.Bare) ) .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(el => { // received offline presence from a contact System.Diagnostics.Debug.WriteLine($"offline presence from: {el.Cast<MatrixPresence>().From}"); var pres = el.Cast <MatrixPresence>(); var contact = contacts.FirstOrDefault(ct => ct.Jid == pres.From.Bare); contact.Presences.Remove(p => p.Resource == pres.From.Resource); }); xmppClient .XmppXElementStreamObserver .Where(el => el.OfType <MatrixMessage>() && el.Cast <MatrixMessage>().Type == MatriXMessageType.Chat && el.Cast <MatrixMessage>().From != null && el.Cast <MatrixMessage>().Body != null ) .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(el => { var msg = el.Cast <MatrixMessage>(); Contact contact; // handle incoming chat message if (!viewModel.Chats.Any(c => c.Jid == msg.From.Bare)) { if (contacts.Contains(msg.From.Bare)) { contact = contacts[msg.From.Bare]; } else { contact = new Contact(msg.From.Bare); } viewModel.AddChatMenu(contact, false); } else { contact = contacts[msg.From.Bare]; } contact.LastMessageResource = msg.From.Resource; var viewMessage = mapper.Map <Message>(msg); viewMessage.Nickname = contact.Name; viewMessage.IsSelf = false; if (msg.Id != null) { viewMessage.Id = msg.Id; } viewModel.GetChatMenu(msg.From.Bare).Messages.Add(viewMessage); }); /* * <presence> * <show>away</show> * <status>Kann nicht chatten. Muss arbeiten.</status> * <priority>40</priority> * <c xmlns="http://jabber.org/protocol/caps" ver="r75qsgpbcZtkumlpddBcZZCeDco=" hash="sha-1" node="http://psi-im.org"/> * <x xmlns="vcard-temp:x:update"> * <photo>9b33b369b378be852b8487e23105dd4bd880a0f0</photo> * </x> * </presence> * */ }
/// <summary> /// Load targets that handled by the zone /// </summary> /// <param name="presenceManager"></param> /// <param name="player"></param> /// <returns></returns> public IEnumerable <IZoneMissionTarget> LoadZoneTargets(IPresenceManager presenceManager, Player player) { var records = Db.Query().CommandText("select * from missiontargetsarchive where characterid=@characterID and missionid=@missionID and missionguid=@guid") .SetParameter("@characterID", player.Character.Id) .SetParameter("@missionID", missionId) .SetParameter("@guid", missionGuid) .Execute().ToList(); foreach (var record in records) { var completed = record.GetValue <bool>("completed"); if (completed) { continue; } var targetId = record.GetValue <int>("targetid"); //original from cache MissionTarget targetFromCache; if (!_missionDataCache.GetTargetById(targetId, out targetFromCache)) { continue; } //duplicate and apply running parameters var target = targetFromCache.GetClone(); target.ModifyWithRecord(record); if (target.ValidZoneSet && target.ZoneId != _zone.Configuration.Id) { //not for this zone continue; } //this is the current progress var currentProgress = record.GetValue <int>("progresscount"); Logger.Info("mission target progress: " + currentProgress + " targetID:" + target.id + " missionID:" + missionId + " characterID:" + player.Character.Id + " " + target.Type); //these types are not needed on the zone switch (target.Type) { case MissionTargetType.research: case MissionTargetType.massproduce: case MissionTargetType.prototype: case MissionTargetType.fetch_item: case MissionTargetType.teleport: continue; } IZoneMissionTarget zoneTarget = null; //generate proper class switch (target.Type) { case MissionTargetType.reach_position: zoneTarget = new ReachPositionZoneTarget(_zone, player, target, this); break; case MissionTargetType.loot_item: { var pc = new ProgressCounter(currentProgress, target.Quantity); zoneTarget = new LootZoneTarget(_zone, player, target, this, pc); break; } case MissionTargetType.kill_definition: { var pc = new ProgressCounter(currentProgress, target.Quantity); zoneTarget = new KillZoneTarget(_zone, player, target, this, pc); break; } case MissionTargetType.scan_mineral: zoneTarget = new ScanMaterialZoneTarget(_zone, player, target, this); break; case MissionTargetType.scan_unit: { var pc = new ProgressCounter(currentProgress, target.Quantity); zoneTarget = new ScanUnitZoneTarget(_zone, player, target, this, pc); break; } case MissionTargetType.scan_container: { var pc = new ProgressCounter(currentProgress, target.Quantity); zoneTarget = new ScanContainerZoneTarget(_zone, player, target, this, pc); break; } case MissionTargetType.drill_mineral: { var pc = new ProgressCounter(currentProgress, target.Quantity); zoneTarget = new DrillMineralZoneTarget(_zone, player, target, this, pc); break; } case MissionTargetType.submit_item: { var pc = new ProgressCounter(currentProgress, target.Quantity); zoneTarget = new SubmitItemZoneTarget(_zone, player, target, this, pc); break; } case MissionTargetType.use_switch: zoneTarget = new AlarmSwitchZoneTarget(_zone, player, target, this); break; case MissionTargetType.find_artifact: zoneTarget = new FindArtifactZoneTarget(_zone, player, target, this, presenceManager); break; case MissionTargetType.use_itemsupply: { var pc = new ProgressCounter(currentProgress, target.Quantity); zoneTarget = new ItemSupplyZoneTarget(_zone, player, target, this, pc); break; } case MissionTargetType.harvest_plant: { var pc = new ProgressCounter(currentProgress, target.Quantity); zoneTarget = new HarvestPlantZoneTarget(_zone, player, target, this, pc); break; } case MissionTargetType.summon_npc_egg: zoneTarget = new SummonNpcEggZoneTarget(_zone, player, target, this); break; case MissionTargetType.pop_npc: zoneTarget = new PopNpcZoneTarget(_zone, player, target, this, presenceManager); break; case MissionTargetType.lock_unit: { var pc = new ProgressCounter(currentProgress, target.Quantity); zoneTarget = new LockUnitZoneTarget(_zone, player, target, this, pc); break; } } if (zoneTarget == null) { Logger.Error("no class defined for:" + target.Type); continue; } yield return(zoneTarget); } }
public PopNpcZoneTarget(IZone zone, Player player, MissionTarget target, ZoneMissionInProgress zoneMissionInProgress, IPresenceManager presenceManager) : base(zone, player, target, zoneMissionInProgress) { _presenceManager = presenceManager; }