public void OnMemberJoined(UUID AgentId) { if (AgentId == client.Self.AgentID) { return; } var changes = new ChannelMemberChangeEventArgs(); var newmember = new ChannelMemberChangeEventArgs.ChangeDetails(); newmember.Subject = mapper.MapUser(AgentId); newmember.NewPosition = PositionCategory.Distant; newmember.OldPosition = PositionCategory.Distant; client.Self.GroupChatSessions.Lock(d => { var cachedMembership = d[group.ID].FirstOrDefault(i => i.AvatarKey == AgentId); if (cachedMembership.AvatarKey == AgentId) { newmember.IsOperator = cachedMembership.IsModerator; } }); changes.NewMembers.Add(newmember); if (MembersChanged != null) { MembersChanged(this, changes); } }
private void GridClient_FriendPresenceChanged(object sender, OpenMetaverse.FriendInfoEventArgs e) { var mappedFriend = mapper.MapUser(e.Friend.UUID, e.Friend.Name); if (e.Friend.IsOnline) { SendOnline(mappedFriend); } else { SendOffline(mappedFriend); } }
public LocalChannel(OpenMetaverse.GridClient client, IIdentityMapper mapper) { this.client = client; this.mapper = mapper; this.nearby = new Dictionary<string, Dictionary<UUID, ChannelMembership>>(); var selfmember = new ChannelMembership(); selfmember.IsOperator = false; selfmember.Position = PositionCategory.Whisper; selfmember.Subject = mapper.MapUser(client.Self.AgentID, client.Self.Name); var thissimlist = new Dictionary<UUID, ChannelMembership>(); thissimlist.Add(client.Self.AgentID, selfmember); nearby.Add(client.Network.CurrentSim.Name, thissimlist); client.Grid.CoarseLocationUpdate += OnLocationUpdate; client.Self.ChatFromSimulator += OnLocalChat; }
public LocalChannel(OpenMetaverse.GridClient client, IIdentityMapper mapper) { this.client = client; this.mapper = mapper; this.nearby = new Dictionary <string, Dictionary <UUID, ChannelMembership> >(); var selfmember = new ChannelMembership(); selfmember.IsOperator = false; selfmember.Position = PositionCategory.Whisper; selfmember.Subject = mapper.MapUser(client.Self.AgentID, client.Self.Name); var thissimlist = new Dictionary <UUID, ChannelMembership>(); thissimlist.Add(client.Self.AgentID, selfmember); nearby.Add(client.Network.CurrentSim.Name, thissimlist); client.Grid.CoarseLocationUpdate += OnLocationUpdate; client.Self.ChatFromSimulator += OnLocalChat; }
private void OnMessageFromAgent(InstantMessageEventArgs e) { var msg = new IntermediateMessage(); msg.Sender = mapper.MapUser(e.IM.FromAgentID, e.IM.FromAgentName); msg.Timestamp = e.IM.Timestamp; msg.Type = MessageType.IM; msg.Payload = e.IM.Message; UUID sid = e.IM.IMSessionID; if (groups.ContainsKey(sid)) { channels[sid].SendMessageDownstream(msg); return; } oneOnOnesessions[e.IM.FromAgentID] = sid; if (this.ReceiveMessage != null) { ReceiveMessage(null, msg); } }
public void OnLocationUpdate(object sender, CoarseLocationUpdateEventArgs e) { var evt = new ChannelMemberChangeEventArgs(); Dictionary <UUID, ChannelMembership> nearbyAvatars; if (e.Simulator.Name != client.Network.CurrentSim.Name) { return; } if (!nearby.TryGetValue(e.Simulator.Name, out nearbyAvatars)) { nearbyAvatars = new Dictionary <UUID, ChannelMembership>(); nearby.Add(e.Simulator.Name, nearbyAvatars); } foreach (var i in e.NewEntries) { if (i == client.Self.AgentID) { continue; } var detail = new ChannelMemberChangeEventArgs.ChangeDetails(); detail.Subject = mapper.MapUser(i); detail.IsOperator = false; detail.WasOperator = false; detail.NewPosition = CategorisePosition(i, e); detail.OldPosition = PositionCategory.Distant; evt.NewMembers.Add(detail); var membership = new ChannelMembership(); membership.Subject = detail.Subject; membership.IsOperator = false; membership.Position = CategorisePosition(i, e); if (nearbyAvatars.ContainsKey(i)) { nearbyAvatars[i] = membership; } else { nearbyAvatars.Add(i, membership); } } foreach (var i in e.RemovedEntries) { if (i == client.Self.AgentID) { continue; } var detail = new ChannelMemberChangeEventArgs.ChangeDetails(); if (nearbyAvatars.ContainsKey(i)) { detail.Subject = nearbyAvatars[i].Subject; detail.IsOperator = false; detail.WasOperator = false; detail.NewPosition = PositionCategory.Distant; detail.OldPosition = nearbyAvatars[i].Position; evt.RemovedMembers.Add(detail); nearbyAvatars.Remove(i); } } foreach (var i in nearbyAvatars) { if (i.Key == client.Self.AgentID) { continue; } var newpos = CategorisePosition(i.Key, e); if (i.Value.Position != newpos) { var detail = new ChannelMemberChangeEventArgs.ChangeDetails(); detail.Subject = nearbyAvatars[i.Key].Subject; detail.IsOperator = false; detail.WasOperator = false; detail.NewPosition = newpos; detail.OldPosition = nearbyAvatars[i.Key].Position; evt.ChangedMembers.Add(detail); nearbyAvatars[i.Key].Position = newpos; } } if (!evt.HasChanges) { return; } lock (syncRoot) { if (state != ChannelState.Connected) { state = ChannelState.Connected; joinTask.SetResult(true); } } if (this.MembersChanged != null) { MembersChanged(this, evt); } }
private void OnConnectedMessage(Message msg) { switch (msg.Command) { case "PING": SendFromServer("PONG", msg.Argv.ToArray()); break; case "QUIT": upstream.Disconnect(); state = ConnectionState.CLOSED; break; case "JOIN": break; case "PART": if (msg.Argv.Count < 1) { SendNeedMoreParams("PART"); break; } SendFromClient("JOIN", msg.Argv[0]); break; case "PRIVMSG": OnPrivmsg(msg); break; case "WHO": OnWho(msg); break; case "NAMES": if (msg.Argv.Count < 1) { SendNeedMoreParams("NAMES"); break; } OnNames(msg.Argv[0]); break; case "MODE": OnMode(msg); break; case "TOPIC": if (msg.Argv.Count < 1) { SendNeedMoreParams("TOPIC"); break; } if (msg.Argv.Count > 1) { SendFromServer(Numeric.ERR_CHANOPRIVSNEEDED, "You can't set topics"); break; } OnTopic(msg); break; case "USERHOST": if (msg.Argv.Count < 1) { SendNeedMoreParams("USERHOST"); break; } var id = mapper.MapUser(msg.Argv[0]); SendFromServer(Numeric.RPL_USERHOST, username, String.Format("{0}=+{1}@{2}", id.IrcNick, id.IrcIdent, id.IrcDomain)); break; default: SendFromServer(Numeric.ERR_UNKNOWNCOMMAND, username, msg.Command, "Not implemented!"); break; } }