示例#1
0
 public UserBus(IConnection connection, IUserService userService, IBackgroundTaskQueue taskQueue, ILogProvider logProvider) : base(taskQueue, logProvider)
 {
     this._userService    = userService;
     this._taskQueue      = taskQueue;
     this._logger         = logProvider.CreateLogger <UserBus>();
     this._channel        = connection.CreateModel();
     this._consumerAdd    = new AddEvent(this._channel);
     this._consumerUpdate = new UpdateEvent(this._channel);
     this._consumerDelete = new DeleteEvent(this._channel);
 }
示例#2
0
    public void Remove(IUpdateEvent updateEvent)
    {
        if (!IsAdded(updateEvent))
        {
            LogUtil.W("UpdateEvent remove failed, not found!");
            return;
        }

        _updateEventList.Remove(updateEvent);
    }
示例#3
0
    public void Add(IUpdateEvent updateEvent)
    {
        if (IsAdded(updateEvent))
        {
            LogUtil.W("UpdateEvent has been added!");
            return;
        }

        _updateEventList.Add(updateEvent);
    }
示例#4
0
        ////////////////////////////////////////////////////////////////////////


        /// <summary>
        /// Prints our the various commands with useful debugging info
        /// </summary>
        private void HandleEvent(ref IUpdateEvent ue)
        {
            interrupted = false;

            evtText  = ue.Text();
            evtType  = ue.Type();
            evtActor = ue.Actor();

            //evtText = "["+evtActor + "] " + evtText;

            ue.RemoveKeys(Meta.TEXT, Meta.TYPE, Meta.ACTOR);

            switch (evtType)
            {
            case "Say":
                evtText = evtText + " " + ue.Data().Stringify();
                break;

            case "Ask":
                DoPrompt(ue);
                SendRandomResponse(ue);
                break;

            case "Wait":
                var now = Util.Millis();

                Timers.SetTimeout(3000, () =>
                {
                    if (!interrupted)
                    {
                        Console.WriteLine("\n<resume-event#>" +
                                          " after " + Util.Millis(now) + "ms\n");

                        // send ResumeEvent after 5 sec
                        // (), (#Game), or ({type=a,stage=b,last=true})
                        gameEvent = new ResumeEvent();
                    }
                });

                evtText = ("(" + (evtType + " " +
                                  ue.Data().Stringify()).Trim() + ")");
                break;

            default:
                evtText = ("(" + evtType + ": " + (evtText + " "
                                                   + ue.Data().Stringify()).Trim() + ")");
                break;
            }

            Console.WriteLine(evtText);

            ue = null;  // dispose event
        }
示例#5
0
        public static void ApplyPropertyUpdates(this IUpdateEvent updateEvent, object target)
        {
            var targetType = target.GetType();

            updateEvent.DirtyProperties.ForEach(prop => {
                if (Attribute.GetCustomAttribute(prop, typeof(MappingAttribute)) is MappingAttribute mappingAttr)
                {
                    var property = targetType.GetProperty(mappingAttr.PropertyToName);
                    property.SetValue(target, prop.GetValue(updateEvent));
                }
            });
        }
示例#6
0
 public void Run()
 {
     while (true)
     {
         IUpdateEvent ue = dialogic.Update(globals, ref gameEvent);
         if (ue != null)
         {
             HandleEvent(ref ue);
         }
         Thread.Sleep(30);
     }
 }
示例#7
0
        /// <summary>
        /// Start the Run loop for the engine
        /// </summary>
        public void Run()
        {
            TestEvents(Util.Millis());

            while (true)
            {
                Thread.Sleep(30);
                IUpdateEvent ue = dialogic.Update(globals, ref gameEvent);
                if (ue != null)
                {
                    HandleEvent(ref ue);
                }
            }
        }
示例#8
0
        private void HandleEvent(ref IUpdateEvent ue)
        {
            evtText  = ue.Text();
            evtType  = ue.Type();
            evtActor = ue.Actor();

            if (evtActor != null)
            {
                evtText = evtActor + ": " + evtText;
            }

            ue.RemoveKeys(Meta.TEXT, Meta.TYPE, Meta.ACTOR);

            switch (evtType)
            {
            case "Say":
                evtText = evtText + " " + ue.Data().Stringify();
                break;

            case "Ask":
                DoPrompt(ue);
                // respond with 'new ChoiceEvent(choiceIdx);'
                break;

            case "Wait":
                evtText = ("(" + (evtType + " " +
                                  ue.Data().Stringify()).Trim() + ")");
                break;

            default:
                evtText = ("(" + evtType + ": " + (evtText + " "
                                                   + ue.Data().Stringify()).Trim() + ")");
                break;
            }

            Display(evtText);

            if (evtType == "Ask")
            {
                // default is to reprompt on timeout
                int timeout = Util.ToMillis(ue.GetDouble(Meta.TIMEOUT));
                while (!DoResponse(timeout))
                {
                    Display(evtText);
                }
            }

            ue = null;  // dispose event
        }
示例#9
0
        private void DoPrompt(IUpdateEvent ue)
        {
            evtOpts = ue.Get(Meta.OPTS).Split('\n');

            ue.RemoveKeys(Meta.TEXT, Meta.TYPE, Meta.OPTS);

            // add any meta tags
            evtText = evtText + " " + ue.Data().Stringify();

            // add the options
            for (int i = 0; i < evtOpts.Length; i++)
            {
                evtText += "\n  (" + i + ") " + evtOpts[i];
            }
        }
示例#10
0
        private void SendRandomResponse(IUpdateEvent ue)
        {
            double timeout = ue.GetDouble(Meta.TIMEOUT, -1);

            if (timeout > -1)
            {
                var delay = Util.ToMillis(Util.Rand(timeout / 3, timeout));
                Timers.SetTimeout(delay, () =>
                {
                    // choice a valid response, or -1 for no response
                    int choice = Util.Rand(evtOpts.Length + 1) - 1;
                    Console.WriteLine("\n<choice-index#" + choice + "> after " + delay + "ms\n");
                    gameEvent = new ChoiceEvent(choice);
                });
            }
        }
示例#11
0
        public async Task NotifyEvent(IUpdateEvent updateEvent)
        {
            //var targets = updateEvent.Targets;
            //var msg = updateEvent.Message;
            var messages      = updateEvent.Messages;
            var initiatorGuid = updateEvent.Initiator;

            //For Initiator we dont want to send immediately because its page will be refreshed
            foreach (var targets in messages.Keys)
            {
                var msg = updateEvent.Messages[targets];
                if (targets.Contains(initiatorGuid))
                {
                    if (!_userGuidToNotificationsQueue.ContainsKey(initiatorGuid))
                    {
                        _userGuidToNotificationsQueue.Add(initiatorGuid, new ConcurrentQueue <string>());
                    }
                    _userGuidToNotificationsQueue[initiatorGuid].Enqueue(msg);
                    targets.Remove(initiatorGuid);
                }
                foreach (var target in targets)
                {
                    var targetSessionid = _sessionManager.GetSessionId(target);
                    if (!targetSessionid.Equals(Guid.Empty))
                    {
                        if (_sessionIdToWebSocket.ContainsKey(targetSessionid))
                        {
                            var socket = _sessionIdToWebSocket[targetSessionid];
                            await SendMessage(socket, msg);
                        }
                    }
                    else
                    {
                        if (!_userGuidToNotificationsQueue.ContainsKey(target))
                        {
                            _userGuidToNotificationsQueue.Add(target, new ConcurrentQueue <string>());
                        }
                        _userGuidToNotificationsQueue[target].Enqueue(msg);
                    }
                }
            }
        }
示例#12
0
 internal void RunInLoop() // repeated events
 {
     //int ts = 0;
     //int count = 0;
     while (true)
     {
         Thread.Sleep(30);
         IUpdateEvent ue = dialogic.Update(globals, ref gameEvent);
         if (ue != null)
         {
             HandleEvent(ref ue);
         }
         //if (Util.Millis(ts) > 1000) {
         //    ts = Util.Millis();
         //    if (++count < 5) {
         //        FuzzySearch.DBUG = count == 4;
         //        gameEvent = new ResumeEvent("{type = test}");
         //    }}
     }
 }
示例#13
0
        private void HandleEvent(ref IUpdateEvent ue)
        {
            evtText  = ue.Text();
            evtType  = ue.Type();
            evtActor = ue.Actor();

            //evtText = "["+evtActor + "] " + evtText;

            ue.RemoveKeys(Meta.TEXT, Meta.TYPE, Meta.ACTOR);

            switch (evtType)
            {
            case "Say":
                evtText = evtText + " " + ue.Data().Stringify();
                break;

            case "Ask":
                DoPrompt(ue);
                // respond with 'new ChoiceEvent(choiceIdx);'
                break;

            case "Wait":
                evtText = ("(" + (evtType + " " +
                                  ue.Data().Stringify()).Trim() + ")");
                break;

            default:
                evtText = ("(" + evtType + ": " + (evtText + " "
                                                   + ue.Data().Stringify()).Trim() + ")");
                break;
            }

            Console.WriteLine(evtText);

            ue = null;  // dispose event
        }
示例#14
0
        internal int Launch(Chat next, bool resetCursor = true)
        {
            if (next == null)
            {
                throw new DialogicException
                          ("Attempt to launch a null Chat");
            }

            nextEventTime = Util.Millis();
            chat          = next;
            chat.Run(resetCursor);

            // Chats are not ISendable, but its useful for the client to know
            // when a new Chat is started, so we send the minimal data here
            chatEvent = new UpdateEvent(new Dictionary <string, object>()
            {
                { Meta.TYPE, chat.TypeName() },
                { Meta.TEXT, chat.text },
            });

            Info("\n<#" + chat.text + (resetCursor ? "-started>" : "-resumed>"));

            return(nextEventTime);
        }
示例#15
0
 public static void RaiseEvent(IUpdateEvent updateEvent)
 {
     SubscribersHandlers?.Invoke(updateEvent);
 }
示例#16
0
文件: Demo.cs 项目: siusoon/dialogic
        /// <summary>
        /// Start the Run loop for the engine
        /// </summary>
        public void Run()
        {
            var now = Util.Millis();

            // a 'Load' event
            if (false)
            {
                Timers.SetTimeout(Util.Rand(4000, 6000), () =>
                {
                    Console.WriteLine("\n<load-event#chats>\n");

                    var runtime = new ChatRuntime(Client.AppConfig.TAC);
                    runtime.ParseText(string.Join('\n', new[] {
                        "CHAT GScriptTest {type=a,stage=b}",
                        "*** Welcome to my updated world!!!"
                    }));
                    gameEvent = new LoadEvent(runtime.Chats());
                });
            }

            // a 'Save' event
            if (false)
            {
                Timers.SetTimeout(Util.Rand(4000, 6000), () =>
                {
                    var file = AppDomain.CurrentDomain.BaseDirectory;
                    file    += Util.EpochMs() + ".ser";

                    Console.WriteLine("\n<save-event#file=" + file + ">\n");

                    gameEvent = new SaveEvent(serializer, new FileInfo(file));
                });
            }

            // a 'Tap' event
            if (false)
            {
                Timers.SetTimeout(Util.Rand(2000, 9999), () =>
                {
                    Console.WriteLine("\n<user-event#tap>" +
                                      " after " + Util.Millis(now) + "ms\n");

                    gameEvent = new UserEvent("Tap");
                });
            }

            var types = new[] { "critic", "shake", "tap" };
            var count = 0;

            // a 'Resume' event
            if (false)
            {
                Timers.SetInterval(1000, () =>
                {
                    interrupted = true;
                    var data    = "{!!type = TYPE,!stage = CORE}";
                    data        = data.Replace("TYPE", types[++count % 3]);

                    Console.WriteLine("\n<resume-event#" + data + ">" +
                                      " after " + Util.Millis(now) + "ms\n");

                    gameEvent = new ResumeEvent(data);
                });
            }

            while (true)
            {
                Thread.Sleep(30);
                IUpdateEvent ue = dialogic.Update(globals, ref gameEvent);
                if (ue != null)
                {
                    HandleEvent(ref ue);
                }
            }
        }
示例#17
0
 public async Task HandleUpdate(IUpdateEvent updateEvent)
 {
     //_logger.Log(LogLevel.Information, string.Join('\n', updateEvent.Messages.Values));
     await _notifier.NotifyEvent(updateEvent);
 }
示例#18
0
 public bool IsAdded(IUpdateEvent updateEvent)
 {
     return(_updateEventList.IndexOf(updateEvent) != -1);
 }