예제 #1
0
        public Task <AgentContext <FactoryState> > Run(object state, AgentCapability self, object message)
        {
            var agentState = state as FactoryState ?? new FactoryState();
            var context    = new AgentContext <FactoryState>(agentState, self);

            switch (message)
            {
            case InitWetonomyAgentMessage initMsg:
                var distributeCapabilityMessage = new DistributeCapabilitiesMessage
                {
                    Id = self.Issuer,
                    AgentCapabilities = new Dictionary <string, AgentCapability>()
                    {
                        { "CreateGroupMessage", context.IssueCapability(new[] { typeof(CreateGroupMessage) }) },
                        { "CreateMemberMessage", context.IssueCapability(new[] { typeof(CreateMemberMessage) }) },
                        { "RemoveRefMessage", context.IssueCapability(new[] { typeof(RemoveRefMessage) }) },
                        { "GetCapabilityMessage", context.IssueCapability(new[] { typeof(GetCapabilityMessage) }) },
                        { "ForwardMessage", context.IssueCapability(new[] { typeof(ForwardMessage) }) }
                    }
                };
                context.SendMessage(initMsg.CreatorAgentCapability, distributeCapabilityMessage, null);
                break;

            case CreateGroupMessage createGroupMsg:
                // should use created one
                var distribute = context.IssueCapability(new[] { typeof(DistributeCapabilitiesMessage) });
                context.CreateAgent(createGroupMsg.Id, "GroupAgent", distribute, null);
                break;

            case CreateMemberMessage createMemberMessage:
                // should use created one
                var distribute2 = context.IssueCapability(new[] { typeof(DistributeCapabilitiesMessage) });
                context.CreateAgent(createMemberMessage.Id, "MemberAgent", distribute2, null);
                break;

            case RemoveRefMessage removeMemberMessage:
                context.State.AgentToCapabilities.Remove(removeMemberMessage.Id);
                break;

            // for forwarding
            case GetCapabilityMessage getCapabilitiesMessage:
                var capability = context.IssueCapability(new[] { getCapabilitiesMessage.CapabilityType });
                var distributeCapabilityMsg = new DistributeCapabilitiesMessage
                {
                    Id = getCapabilitiesMessage.Sender,
                    AgentCapabilities = new Dictionary <string, AgentCapability>()
                    {
                        { getCapabilitiesMessage.CapabilityType.Name, capability },
                    }
                };
                //check if Type.Name works as expected
                context.SendMessage(null, distributeCapabilityMsg, null);
                break;

            case DistributeCapabilitiesMessage distributeCapabilitiesMsg:
                context.State.AgentToCapabilities.Add(distributeCapabilitiesMsg.Id, distributeCapabilitiesMsg.AgentCapabilities);
                break;

            default:
                Task <AgentContext <BaseState> > secondaryContextTask = base.Run(agentState, self, message);
                var secondaryContext = secondaryContextTask.GetAwaiter().GetResult();
                context.MergeSecondaryContext(secondaryContext.GetCommands());
                break;
            }

            return(Task.FromResult(context));
        }