Exemple #1
0
        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;
 }