Пример #1
0
 void HandleListenEvent()
 {
     if (ListenEvent != null)
     {
         ListenEvent.Invoke();
     }
 }
Пример #2
0
 private void OnListenEventReceived(ListenEvent e)
 {
     if (ListenEventReceived != null)
     {
         ListenEventReceived.Invoke(this, e);
     }
 }
Пример #3
0
        public override void Send(ListenEvent ev)
        {
            if (!string.IsNullOrEmpty(m_Name) &&
                ev.Name != m_Name)
            {
                return;
            }
            if (m_ID != UUID.Zero)
            {
                if (m_ID.Equals(UUID.Zero))
                {
                    /* expected ID matches UUID.Zero, so we want to receive every possible UUID */
                }
                else if (!m_ID.Equals(ev.ID))
                {
                    return;
                }
            }
            if (!string.IsNullOrEmpty(m_Message) &&
                ev.Message != m_Message)
            {
                return;
            }

            if (IsActive)
            {
                m_Send(ev);
            }
        }
Пример #4
0
        public void Send(ListenEvent ev)
        {
            double sayDistanceSquared     = m_Handler.SayDistance * m_Handler.SayDistance;
            double shoutDistanceSquared   = m_Handler.ShoutDistance * m_Handler.ShoutDistance;
            double whisperDistanceSquared = m_Handler.WhisperDistance * m_Handler.WhisperDistance;

            foreach (ChatServiceInterface.Listener listener in Listeners)
            {
                try
                {
                    switch (ev.Type)
                    {
                    case ListenEvent.ChatType.Region:
                    case ListenEvent.ChatType.DebugChannel:
                    case ListenEvent.ChatType.Broadcast:
                        listener.Send(ev);
                        break;

                    case ListenEvent.ChatType.Say:
                        SendToListener(listener, ev, sayDistanceSquared);
                        break;

                    case ListenEvent.ChatType.Shout:
                        SendToListener(listener, ev, shoutDistanceSquared);
                        break;

                    case ListenEvent.ChatType.Whisper:
                        SendToListener(listener, ev, whisperDistanceSquared);
                        break;

                    case ListenEvent.ChatType.OwnerSay:
                        if (listener.GetUUID().Equals(ev.TargetID))
                        {
                            listener.Send(ev);
                        }
                        break;

                    case ListenEvent.ChatType.StartTyping:
                    case ListenEvent.ChatType.StopTyping:
                        if (!listener.IsAgent)
                        {
                            /* listener is not an agent, so no typing messages */
                        }
                        else
                        {
                            SendToListener(listener, ev, sayDistanceSquared);
                        }
                        break;

                    default:
                        break;
                    }
                }
                catch
                {
                    /* ignore in the rare case that an object is part died */
                }
            }
        }
        protected void ChatPassLocalNeighbors(ListenEvent le)
        {
            if (le.Type != ListenEvent.ChatType.Say &&
                le.Type != ListenEvent.ChatType.Shout &&
                le.Type != ListenEvent.ChatType.Whisper)
            {
                /* only pass those above */
                return;
            }
            var activelist = m_ChatPassInEnableSetToLocal ? m_ChatPassInEnableLocal : m_ChatPassInEnableGlobal;

            foreach (var kvp in Neighbors)
            {
                SceneInterface remoteScene;
                var            m_TryGetScene = TryGetScene;
                if (!(activelist.Count == 0 || activelist.Contains(le.ID) || activelist.Contains(UUID.Zero)))
                {
                    continue;
                }

                if (kvp.Value.RemoteCircuit != null)
                {
                    Vector3 newPosition = le.GlobalPosition + kvp.Value.RemoteOffset;
                    if (newPosition.X >= -le.Distance &&
                        newPosition.Y >= -le.Distance &&
                        newPosition.X <= kvp.Value.RemoteRegionData.Size.X + le.Distance &&
                        newPosition.Y <= kvp.Value.RemoteRegionData.Size.Y + le.Distance)
                    {
                        kvp.Value.RemoteCircuit.SendMessage(new ChatPass
                        {
                            ChatType   = (ChatType)(byte)le.Type,
                            Name       = le.Name,
                            Message    = le.Message,
                            Position   = newPosition,
                            ID         = le.ID,
                            SourceType = (ChatSourceType)(byte)le.SourceType,
                            OwnerID    = le.OwnerID,
                            Channel    = le.Channel
                        });
                    }
                }
                else if (m_TryGetScene != null && m_TryGetScene(kvp.Key, out remoteScene))
                {
                    Vector3 newPosition = le.GlobalPosition + kvp.Value.RemoteOffset;
                    if (newPosition.X >= -le.Distance &&
                        newPosition.Y >= -le.Distance &&
                        newPosition.X <= kvp.Value.RemoteRegionData.Size.X + le.Distance &&
                        newPosition.Y <= kvp.Value.RemoteRegionData.Size.Y + le.Distance)
                    {
                        remoteScene.SendChatPass(new ListenEvent(le)
                        {
                            OriginSceneID  = ID,
                            GlobalPosition = newPosition
                        });
                    }
                }
            }
        }
Пример #6
0
        /// <summary>
        /// 移除监听事件
        /// </summary>
        /// <param name="name"></param>
        /// <param name="listenEvent"></param>
        public static void DetachObseverEvent(string name, ListenEvent listenEvent)
        {
            _Subject _subject;

            if (subjects.TryGetValue(name, out _subject))
            {
                _subject.listen -= listenEvent;
            }
        }
Пример #7
0
        /// <summary>
        /// 添加监听事件
        /// </summary>
        /// <param name="name"></param>
        /// <param name="listenEvent"></param>
        public static void AttachObseverEvent(string name, ListenEvent listenEvent)
        {
            _Subject _subject;

            if (!subjects.TryGetValue(name, out _subject))
            {
                AttachSubject(name);
            }
            subjects.TryGetValue(name, out _subject);
            _subject.listen += listenEvent;
        }
Пример #8
0
 private void DebugChannelLog(ListenEvent ev)
 {
     if (ev.TargetID != UUID.Zero)
     {
         m_DebugChatLog.InfoFormat("{0} ({1}, {2} at {5}) to {6}: {3}: {4}", ev.Name, ev.ID, ev.SourceType.ToString(), ev.Type.ToString(), ev.Message, ev.GlobalPosition.ToString(), ev.TargetID);
     }
     else
     {
         m_DebugChatLog.InfoFormat("{0} ({1}, {2} at {5}): {3}: {4}", ev.Name, ev.ID, ev.SourceType.ToString(), ev.Type.ToString(), ev.Message, ev.GlobalPosition.ToString());
     }
 }
Пример #9
0
        public bool Listen(string address, int port)
        {
            m_Port = port;

            m_SocketId = UNET.NetworkTransport.AddHost(new SocketContract(m_ConnectionConfig, m_MaxConnection), m_Port, address);

            if (IsActive)
            {
                ListenEvent?.Invoke();
            }

            return(this.IsActive);
        }
        public void ChatPassInbound(UUID fromRegionID, ListenEvent ev)
        {
            if (ev.Type != ListenEvent.ChatType.Say &&
                ev.Type != ListenEvent.ChatType.Shout &&
                ev.Type != ListenEvent.ChatType.Whisper)
            {
                /* only pass those above */
                return;
            }
            var activelist = m_ChatPassInEnableSetToLocal ? m_ChatPassInEnableLocal : m_ChatPassInEnableGlobal;

            if (activelist.Count == 0 || activelist.Contains(UUID.Zero) || activelist.Contains(ev.ID))
            {
                SendChatPass(ev);
            }
        }
Пример #11
0
 /// <summary>
 /// 启动SOCKET服务
 /// </summary>
 public void Start()
 {
     try
     {
         Buffer = new BufferManage(MaxListen, BufferSize);
         Server.Listen(MaxListen);
         ListenEvent?.Invoke(null, new ListenEventArgs {
             Message = Server.LocalEndPoint.ToString()
         });
         StartAccept(null);
     }
     catch (Exception e)
     {
         Log.WriteLog(e.TargetSite + "->" + e.Message, LogType.ERROR);
     }
 }
Пример #12
0
        public override void Send(ListenEvent ev)
        {
            if (m_Name != null)
            {
                if ((m_RegexBitfield & 1) != 0)
                {
                    if (!m_Name.IsMatch(ev.Name))
                    {
                        return;
                    }
                }
                else if (m_NamePlain != ev.Name)
                {
                    return;
                }
            }
            if (m_ID != UUID.Zero)
            {
                if (m_ID.Equals(UUID.Zero))
                {
                    /* expected ID matches UUID.Zero, so we want to receive every possible UUID */
                }
                else if (!m_ID.Equals(ev.ID))
                {
                    return;
                }
            }
            if (m_Message != null)
            {
                if ((m_RegexBitfield & 2) != 0)
                {
                    if (!m_Message.IsMatch(ev.Message))
                    {
                        return;
                    }
                }
                else if (m_MessagePlain != ev.Message)
                {
                    return;
                }
            }

            if (IsActive)
            {
                m_Send(ev);
            }
        }
        private void OnChatReceive(ListenEvent ev)
        {
            if (ev.ID == ID)
            {
                /* if it is this npc, ignore the chat event */
                return;
            }

            foreach (KeyValuePair <UUID, RwLockedDictionary <UUID, int> > kvp in m_ScriptedChatListeners)
            {
                ObjectPart part;
                ObjectPartInventoryItem item;
                if (CurrentScene.Primitives.TryGetValue(kvp.Key, out part))
                {
                    foreach (KeyValuePair <UUID, int> kvpinner in kvp.Value)
                    {
                        if (part.Inventory.TryGetValue(kvpinner.Key, out item))
                        {
                            ScriptInstance instance = item.ScriptInstance;

                            /* Translate listen event to mapped channel */
                            instance?.PostEvent(new ListenEvent
                            {
                                ButtonIndex    = ev.ButtonIndex,
                                Channel        = kvpinner.Value,
                                Distance       = ev.Distance,
                                GlobalPosition = ev.GlobalPosition,
                                ID             = ev.ID,
                                Message        = ev.Message,
                                Name           = ev.Name,
                                OriginSceneID  = ev.OriginSceneID,
                                OwnerID        = ev.OwnerID,
                                SourceType     = ev.SourceType,
                                TargetID       = ev.TargetID,
                                Type           = ev.Type
                            });
                        }
                    }
                }
                else
                {
                    m_ScriptedChatListeners.Remove(kvp.Key);
                }
            }
        }
Пример #14
0
        public override void Send(ListenEvent ev)
        {
            ChannelInfo ci;

            if (m_Channels.TryGetValue(ev.Channel, out ci))
            {
                ci.Send(ev);
            }
            if (ev.Channel != ListenEvent.DEBUG_CHANNEL)
            {
                switch (ev.Type)
                {
                case ListenEvent.ChatType.Say:
                    ev.Distance = SayDistance;
                    break;

                case ListenEvent.ChatType.Shout:
                    ev.Distance = ShoutDistance;
                    break;

                case ListenEvent.ChatType.Whisper:
                    ev.Distance = WhisperDistance;
                    break;

                case ListenEvent.ChatType.Region:
                    break;

                default:
                    return;
                }
                if (ev.SourceType == ListenEvent.ChatSourceType.Object &&
                    ev.OriginSceneID == UUID.Zero)
                {
                    foreach (Listener li in m_ChatPass)
                    {
                        li.Send(ev);
                    }
                }
            }
        }
Пример #15
0
        private void SendToListener(ChatServiceInterface.Listener listener, ListenEvent ev, double maxDistanceSquared)
        {
            Func <UUID> getowner = listener.GetOwner;
            Func <UGI>  getGroup = listener.GetGroup;

            if ((ev.GlobalPosition - listener.GetPosition()).LengthSquared > maxDistanceSquared &&
                !listener.IsIgnorePosition)
            {
                /* too far so no listening */
            }
            else if (listener.LimitToSameGroup && getGroup != null && ev.Group != null && ev.Group.Equals(getGroup()))
            {
                /* ignore group mismatch */
            }
            else if (listener.LimitToSameOwner && getowner != null && getowner() != ev.OwnerID)
            {
                /* ignore owner mismatch */
            }
            else if (ev.TargetID == UUID.Zero ||
                     ev.TargetID == listener.GetUUID())
            {
                listener.Send(ev);
            }
        }
Пример #16
0
        protected override void SendChatPass(ListenEvent le)
        {
            ChatServiceInterface chatService = m_ChatService;

            chatService?.Send(le);
        }
Пример #17
0
 public abstract void Send(ListenEvent ev);
Пример #18
0
 public void RouteChat(ListenEvent ev)
 {
     m_ChatService?.Send(ev);
 }
Пример #19
0
 void HandleListenEvent()
 {
     ListenEvent?.Invoke();
 }
Пример #20
0
 public virtual void Listener_ListenEventReceived(object sender, ListenEvent e)
 {
     Add(e.Message);
 }
 protected virtual void SendChatPass(ListenEvent le)
 {
 }
Пример #22
0
 public string Localize(ListenEvent le, CultureInfo currentCulture) =>
 string.Format(m_NlsRefObject.GetLanguageString(currentCulture, m_NlsId, m_NlsDefMessage), m_Param);
Пример #23
0
        protected override void OnCircuitSpecificPacketReceived(MessageType mType, UDPPacket p)
        {
            /* we know the message type now, so we have to decode it when possible */
            switch (mType)
            {
            case MessageType.ScriptDialogReply:
            /* nothing to do */
            case MessageType.ChatFromViewer:
            /* nothing to do */
            case MessageType.TransferRequest:
                /* nothing to do */
                break;

            case MessageType.ChatPass:
            {
                var ev = new ListenEvent
                {
                    Channel        = p.ReadInt32(),
                    GlobalPosition = p.ReadVector3f(),
                    ID             = p.ReadUUID(),
                    OwnerID        = p.ReadUUID(),
                    Name           = p.ReadStringLen8(),
                    SourceType     = (ListenEvent.ChatSourceType)p.ReadUInt8(),
                    Type           = (ListenEvent.ChatType)p.ReadUInt8()
                };
                /* radius */
                p.ReadFloat();
                /* simaccess */ p.ReadUInt8();
                ev.Message = p.ReadStringLen16();
                var scene = Scene;
                if (scene != null)
                {
                    ev.OriginSceneID = scene.ID;
                    scene.ChatPassInbound(RemoteSceneID, ev);
                }
            }
            break;

            default:
                Func <UDPPacket, Message> del;
                if (m_PacketDecoder.PacketTypes.TryGetValue(mType, out del))
                {
                    var m = del(p);
                    /* we got a decoder, so we can make use of it */
                    m.CircuitAgentID = new UUID(RemoteSceneID);
                    try
                    {
                        m.CircuitAgentOwner = UGUI.Unknown;
                        m.CircuitSessionID  = SessionID;
                        m.CircuitSceneID    = new UUID(RemoteSceneID);
                    }
                    catch
                    {
                        /* this is a specific error that happens only during logout */
                        return;
                    }

                    /* we keep the circuit relatively dumb so that we have no other logic than how to send and receive messages to the remote sim.
                     * It merely collects delegates to other objects as well to call specific functions.
                     */
                    Action <Message> mdel;
                    if (m_MessageRouting.TryGetValue(m.Number, out mdel))
                    {
                        mdel(m);
                    }
                    else if (m.Number == MessageType.ImprovedInstantMessage)
                    {
                        var im = (ImprovedInstantMessage)m;
                        if (im.CircuitAgentID != im.AgentID ||
                            im.CircuitSessionID != im.SessionID)
                        {
                            break;
                        }
                        if (m_IMMessageRouting.TryGetValue(im.Dialog, out mdel))
                        {
                            mdel(m);
                        }
                        else
                        {
                            m_Log.DebugFormat("Unhandled im message {0} received", im.Dialog.ToString());
                        }
                    }
                    else if (m.Number == MessageType.GenericMessage)
                    {
                        var genMsg = (GenericMessage)m;
                        if (m_GenericMessageRouting.TryGetValue(genMsg.Method, out mdel))
                        {
                            mdel(m);
                        }
                        else
                        {
                            m_Log.DebugFormat("Unhandled generic message {0} received", genMsg.Method);
                        }
                    }
                    else if (m.Number == MessageType.GodlikeMessage)
                    {
                        var genMsg = (GodlikeMessage)m;
                        if (m_GodlikeMessageRouting.TryGetValue(genMsg.Method, out mdel))
                        {
                            mdel(m);
                        }
                        else
                        {
                            m_Log.DebugFormat("Unhandled godlike message {0} received", genMsg.Method);
                        }
                    }
                    else
                    {
                        m_Log.DebugFormat("Unhandled message type {0} received", m.Number.ToString());
                    }
                }
                else
                {
                    /* Ignore we have no decoder for that */
                }
                break;
            }
        }