예제 #1
0
        private void BuildFromAttributes()
        {
            Behaviors bhvs = new Behaviors();

            // Launch reflexion
            MemberInfo[] memberInfo = GetType().GetMethods();
            foreach (var mi in memberInfo)
            {
#if NETCOREAPP1_1
                BehaviorAttribute deco = (BehaviorAttribute)mi.GetType().GetTypeInfo().GetCustomAttribute(typeof(BehaviorAttribute));
#else
                BehaviorAttribute deco = (BehaviorAttribute)Attribute.GetCustomAttribute(mi, typeof(BehaviorAttribute));
#endif
                if (deco != null)
                {
                    // add behavior if we can read this method
                    var parameters = ((MethodInfo)mi).GetParameters();
                    if (parameters.Length == 1)
                    {
                        if (parameters[0].ParameterType == typeof(string))
                        {
                            Behavior <string> bhv = new Behavior <string>(s => ((MethodInfo)mi).Invoke(this, new[] { s }));
                            bhvs.AddBehavior(bhv);
                        }
                    }
                }
            }
            Become(bhvs);
        }
예제 #2
0
        /// <summary>
        /// Handle the list information command.  This command lists
        /// information about the core and all loaded behaviors.
        /// </summary>
        /// <param name="chatEvent"></param>
        private void HandleInfoCommand(ChatEvent chatEvent)
        {
            // Create the chat response message
            ChatPacket response = new ChatPacket();

            // Set the player Identifier to reply to
            response.Event.PlayerId = chatEvent.PlayerId;
            response.Event.ChatType = ChatTypes.Private;

            Version coreVersion = Assembly.GetExecutingAssembly().GetName().Version;

            string strVersion = coreVersion.ToString(3);

            // Set up the header block
            response.Event.Message = "< =================================================================== >";
            m_session.TransmitPacket(response);
            response.Event.Message = "< BattleCore version " + strVersion.PadRight(32) + "         by udp  >";
            m_session.TransmitPacket(response);
            response.Event.Message = "< =================================================================== >";
            m_session.TransmitPacket(response);
            response.Event.Message = "< Loaded Behavior         Author      Description                     >";
            m_session.TransmitPacket(response);
            response.Event.Message = "< =================================================================== >";
            m_session.TransmitPacket(response);

            // Send information about each loaded behavior
            foreach (Object behavior in m_core.LoadedBehaviors)
            {
                try
                {
                    // Get the attributes for the listener
                    object[] os = m_core.GetAttributes(behavior.GetType().ToString());

                    // Look for the behavior attribute
                    foreach (object obj in os)
                    {
                        // If the object is a Behavior attribute
                        if (obj is BehaviorAttribute)
                        {
                            // Build the behavior information from the attribute
                            BehaviorAttribute ba       = (obj as BehaviorAttribute);
                            String            strTitle = ba.Title + " " + ba.Version;
                            response.Event.Message = "< " + strTitle.PadRight(24, ' ') + ba.Developers.PadRight(12, ' ') + ba.Description.PadRight(32, ' ') + ">";
                            m_session.TransmitPacket(response);
                        }
                    }
                }
                catch (Exception e)
                {
                    // Send the exception message
                    response.Event.Message = e.Message;
                    m_session.TransmitPacket(response);
                }
            }

            // Close the information block
            response.Event.Message = "< =================================================================== >";
            m_session.TransmitPacket(response);
        }
        private void BuildFromAttributes()
        {
            Behaviors bhvs = new Behaviors();

            // Launch reflexion
            MemberInfo[] memberInfo = GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (var mi in memberInfo)
            {
#if NETCOREAPP1_1
                BehaviorAttribute deco = mi.GetCustomAttribute <BehaviorAttribute>();
#else
                BehaviorAttribute deco = (BehaviorAttribute)Attribute.GetCustomAttribute(mi, typeof(BehaviorAttribute));
#endif
                if (deco != null)
                {
                    var parameters = ((MethodInfo)mi).GetParameters();
                    switch (parameters.Length)
                    {
                    case 0:
                    {
                        throw new ActorException(MessageCantUseDecoratedActporOnNullMessage);
                    }

                    case 1:
                    {
                        Behavior bhv = new Behavior(
                            s => parameters[0].ParameterType.IsAssignableFrom(s.GetType()),
                            s => ((MethodInfo)mi).Invoke(this, new[] { s }));
                        bhvs.AddBehavior(bhv);
                        break;
                    }

                    case 2:
                    {
                        Behavior bhv = new Behavior(
                            s =>
                            {
                                var ts = s.GetType();
                                return(ts.Name == typeof(MessageParam <,>).Name);
                            },
                            s =>
                            {
                                var ts   = s.GetType();
                                var arg1 = ts.GetProperty("Item1").GetValue(s);
                                var arg2 = ts.GetProperty("Item2").GetValue(s);
                                ((MethodInfo)mi).Invoke(this, new[] { arg1, arg2 });
                            });
                        bhvs.AddBehavior(bhv);
                        break;
                    }

                    case 3:
                    {
                        Behavior bhv = new Behavior(
                            s =>
                            {
                                var ts = s.GetType();
                                return(ts.Name == typeof(MessageParam <, ,>).Name);
                            },
                            s =>
                            {
                                var ts   = s.GetType();
                                var arg1 = ts.GetProperty("Item1").GetValue(s);
                                var arg2 = ts.GetProperty("Item2").GetValue(s);
                                var arg3 = ts.GetProperty("Item3").GetValue(s);
                                ((MethodInfo)mi).Invoke(this, new[] { arg1, arg2, arg3 });
                            });
                        bhvs.AddBehavior(bhv);
                        break;
                    }

                    default:
                    {
                        throw new ActorException("Can't use Decorated Actor on too much arguments");
                    }
                    }
                }
            }
            Become(bhvs);
        }
        public static IEnumerable <IBehavior> BuildFromAttributes(IActor linkedActor)
        {
            CheckArg.Actor(linkedActor);
            var bhvs = new List <IBehavior>();

            // Launch reflexion
            MemberInfo[] memberInfo = linkedActor.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (var mi in memberInfo)
            {
#if NETCOREAPP1_1
                BehaviorAttribute deco = mi.GetCustomAttribute <BehaviorAttribute>();
#else
                BehaviorAttribute deco = (BehaviorAttribute)Attribute.GetCustomAttribute(mi, typeof(BehaviorAttribute));
#endif
                if (deco != null)
                {
                    var parameters = ((MethodInfo)mi).GetParameters();
                    switch (parameters.Length)
                    {
                    case 0:
                    {
                        throw new ActorException(MessageNullMessageOnDecoratedActor);
                    }

                    case 1:
                    {
                        Behavior bhv = new Behavior(
                            s => parameters[0].ParameterType.IsAssignableFrom(s.GetType()),
                            s => ((MethodInfo)mi).Invoke(linkedActor, new[] { s }));
                        bhvs.Add(bhv);
                        break;
                    }

                    case 2:
                    {
                        Behavior bhv = new Behavior(
                            s =>
                            {
                                return(s.GetType().Name == typeof(MessageParam <,>).Name);
                            },
                            s =>
                            {
                                var ts   = s.GetType();
                                var arg1 = ts.GetProperty("Item1").GetValue(s);
                                var arg2 = ts.GetProperty("Item2").GetValue(s);
                                ((MethodInfo)mi).Invoke(linkedActor, new[] { arg1, arg2 });
                            });
                        bhvs.Add(bhv);
                        break;
                    }

                    case 3:
                    {
                        Behavior bhv = new Behavior(
                            s =>
                            {
                                return(s.GetType().Name == typeof(MessageParam <, ,>).Name);
                            },
                            s =>
                            {
                                var ts   = s.GetType();
                                var arg1 = ts.GetProperty("Item1").GetValue(s);
                                var arg2 = ts.GetProperty("Item2").GetValue(s);
                                var arg3 = ts.GetProperty("Item3").GetValue(s);
                                ((MethodInfo)mi).Invoke(linkedActor, new[] { arg1, arg2, arg3 });
                            });
                        bhvs.Add(bhv);
                        break;
                    }

                    default:
                    {
                        throw new ActorException(MessageTooMuchArgumentsOnDecoratedActor);
                    }
                    }
                }
            }
            return(bhvs);
        }