diff options
Diffstat (limited to 'OpenSim/Region/Environment/Modules')
-rw-r--r-- | OpenSim/Region/Environment/Modules/FriendsModule.cs | 138 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Modules/InstantMessageModule.cs | 20 |
2 files changed, 158 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/Modules/FriendsModule.cs b/OpenSim/Region/Environment/Modules/FriendsModule.cs index 7560c90..fc14df7 100644 --- a/OpenSim/Region/Environment/Modules/FriendsModule.cs +++ b/OpenSim/Region/Environment/Modules/FriendsModule.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | using System; | 27 | using System; |
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using libsecondlife; | 29 | using libsecondlife; |
30 | using libsecondlife.Packets; | ||
30 | using Nini.Config; | 31 | using Nini.Config; |
31 | using Nwc.XmlRpc; | 32 | using Nwc.XmlRpc; |
32 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
@@ -45,6 +46,8 @@ namespace OpenSim.Region.Environment.Modules | |||
45 | 46 | ||
46 | Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>(); | 47 | Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>(); |
47 | 48 | ||
49 | Dictionary<LLUUID, List<FriendListItem>> FriendLists = new Dictionary<LLUUID, List<FriendListItem>>(); | ||
50 | |||
48 | public void Initialise(Scene scene, IConfigSource config) | 51 | public void Initialise(Scene scene, IConfigSource config) |
49 | { | 52 | { |
50 | lock (m_scene) | 53 | lock (m_scene) |
@@ -78,11 +81,92 @@ namespace OpenSim.Region.Environment.Modules | |||
78 | // Generated by LoginService. The friends are retreived from the database by the UserManager | 81 | // Generated by LoginService. The friends are retreived from the database by the UserManager |
79 | 82 | ||
80 | // Subscribe to instant messages | 83 | // Subscribe to instant messages |
84 | |||
81 | client.OnInstantMessage += OnInstantMessage; | 85 | client.OnInstantMessage += OnInstantMessage; |
82 | client.OnApproveFriendRequest += OnApprovedFriendRequest; | 86 | client.OnApproveFriendRequest += OnApprovedFriendRequest; |
83 | client.OnDenyFriendRequest += OnDenyFriendRequest; | 87 | client.OnDenyFriendRequest += OnDenyFriendRequest; |
84 | client.OnTerminateFriendship += OnTerminateFriendship; | 88 | client.OnTerminateFriendship += OnTerminateFriendship; |
89 | |||
90 | List<FriendListItem> fl = new List<FriendListItem>(); | ||
91 | lock (FriendLists) | ||
92 | { | ||
93 | if (FriendLists.ContainsKey(client.AgentId)) | ||
94 | { | ||
95 | fl = FriendLists[client.AgentId]; | ||
96 | } | ||
97 | else | ||
98 | { | ||
99 | fl = m_scene[0].GetFriendList(client.AgentId); | ||
100 | lock (FriendLists) | ||
101 | { | ||
102 | if (!FriendLists.ContainsKey(client.AgentId)) | ||
103 | FriendLists.Add(client.AgentId, fl); | ||
104 | } | ||
105 | } | ||
106 | } | ||
85 | 107 | ||
108 | List<LLUUID> UpdateUsers = new List<LLUUID>(); | ||
109 | |||
110 | foreach (FriendListItem f in fl) | ||
111 | { | ||
112 | if (m_rootAgents.ContainsKey(f.Friend)) | ||
113 | { | ||
114 | if (f.onlinestatus == false) | ||
115 | { | ||
116 | UpdateUsers.Add(f.Friend); | ||
117 | f.onlinestatus = true; | ||
118 | } | ||
119 | } | ||
120 | } | ||
121 | foreach (LLUUID user in UpdateUsers) | ||
122 | { | ||
123 | ScenePresence av = GetPresenceFromAgentID(user); | ||
124 | if (av != null) | ||
125 | { | ||
126 | List<FriendListItem> usrfl = new List<FriendListItem>(); | ||
127 | |||
128 | lock (FriendLists) | ||
129 | { | ||
130 | usrfl = FriendLists[user]; | ||
131 | } | ||
132 | |||
133 | lock (usrfl) | ||
134 | { | ||
135 | foreach (FriendListItem fli in usrfl) | ||
136 | { | ||
137 | if (fli.Friend == client.AgentId) | ||
138 | { | ||
139 | fli.onlinestatus = true; | ||
140 | OnlineNotificationPacket onp = new OnlineNotificationPacket(); | ||
141 | OnlineNotificationPacket.AgentBlockBlock[] onpb = new OnlineNotificationPacket.AgentBlockBlock[1]; | ||
142 | OnlineNotificationPacket.AgentBlockBlock onpbl = new OnlineNotificationPacket.AgentBlockBlock(); | ||
143 | onpbl.AgentID = client.AgentId; | ||
144 | onpb[0] = onpbl; | ||
145 | onp.AgentBlock = onpb; | ||
146 | av.ControllingClient.OutPacket(onp, ThrottleOutPacketType.Task); | ||
147 | } | ||
148 | } | ||
149 | } | ||
150 | } | ||
151 | } | ||
152 | |||
153 | if (UpdateUsers.Count > 0) | ||
154 | { | ||
155 | OnlineNotificationPacket onp = new OnlineNotificationPacket(); | ||
156 | OnlineNotificationPacket.AgentBlockBlock[] onpb = new OnlineNotificationPacket.AgentBlockBlock[UpdateUsers.Count]; | ||
157 | for (int i = 0; i < UpdateUsers.Count; i++) | ||
158 | { | ||
159 | OnlineNotificationPacket.AgentBlockBlock onpbl = new OnlineNotificationPacket.AgentBlockBlock(); | ||
160 | onpbl.AgentID = UpdateUsers[i]; | ||
161 | onpb[i] = onpbl; | ||
162 | } | ||
163 | onp.AgentBlock = onpb; | ||
164 | client.OutPacket(onp, ThrottleOutPacketType.Task); | ||
165 | } | ||
166 | |||
167 | |||
168 | |||
169 | |||
86 | } | 170 | } |
87 | 171 | ||
88 | private void ClientLoggedOut(LLUUID AgentId) | 172 | private void ClientLoggedOut(LLUUID AgentId) |
@@ -95,6 +179,60 @@ namespace OpenSim.Region.Environment.Modules | |||
95 | m_log.Info("[FRIEND]: Removing " + AgentId + ". Agent logged out."); | 179 | m_log.Info("[FRIEND]: Removing " + AgentId + ". Agent logged out."); |
96 | } | 180 | } |
97 | } | 181 | } |
182 | List<FriendListItem> lfli = new List<FriendListItem>(); | ||
183 | lock (FriendLists) | ||
184 | { | ||
185 | if (FriendLists.ContainsKey(AgentId)) | ||
186 | { | ||
187 | lfli = FriendLists[AgentId]; | ||
188 | } | ||
189 | } | ||
190 | List<LLUUID> updateUsers = new List<LLUUID>(); | ||
191 | foreach (FriendListItem fli in lfli) | ||
192 | { | ||
193 | if (fli.onlinestatus = true) | ||
194 | { | ||
195 | updateUsers.Add(fli.Friend); | ||
196 | } | ||
197 | } | ||
198 | for (int i = 0; i < updateUsers.Count; i++) | ||
199 | { | ||
200 | List<FriendListItem> flfli = new List<FriendListItem>(); | ||
201 | lock (FriendLists) | ||
202 | { | ||
203 | if (FriendLists.ContainsKey(updateUsers[i])) | ||
204 | flfli = FriendLists[updateUsers[i]]; | ||
205 | } | ||
206 | for (int j = 0; j < flfli.Count; j++) | ||
207 | { | ||
208 | if (flfli[i].Friend == AgentId) | ||
209 | { | ||
210 | flfli[i].onlinestatus = false; | ||
211 | } | ||
212 | |||
213 | } | ||
214 | |||
215 | } | ||
216 | for (int i = 0; i < updateUsers.Count; i++) | ||
217 | { | ||
218 | ScenePresence av = GetPresenceFromAgentID(updateUsers[i]); | ||
219 | if (av != null) | ||
220 | { | ||
221 | |||
222 | OfflineNotificationPacket onp = new OfflineNotificationPacket(); | ||
223 | OfflineNotificationPacket.AgentBlockBlock[] onpb = new OfflineNotificationPacket.AgentBlockBlock[1]; | ||
224 | OfflineNotificationPacket.AgentBlockBlock onpbl = new OfflineNotificationPacket.AgentBlockBlock(); | ||
225 | onpbl.AgentID = AgentId; | ||
226 | onpb[0] = onpbl; | ||
227 | onp.AgentBlock = onpb; | ||
228 | av.ControllingClient.OutPacket(onp, ThrottleOutPacketType.Task); | ||
229 | } | ||
230 | } | ||
231 | lock (FriendLists) | ||
232 | { | ||
233 | FriendLists.Remove(AgentId); | ||
234 | } | ||
235 | |||
98 | } | 236 | } |
99 | 237 | ||
100 | private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, LLUUID regionID) | 238 | private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, LLUUID regionID) |
diff --git a/OpenSim/Region/Environment/Modules/InstantMessageModule.cs b/OpenSim/Region/Environment/Modules/InstantMessageModule.cs index 6f7235e..6e13b73 100644 --- a/OpenSim/Region/Environment/Modules/InstantMessageModule.cs +++ b/OpenSim/Region/Environment/Modules/InstantMessageModule.cs | |||
@@ -82,6 +82,7 @@ namespace OpenSim.Region.Environment.Modules | |||
82 | // Don't send a Friend Dialog IM with a LLUUID.Zero session. | 82 | // Don't send a Friend Dialog IM with a LLUUID.Zero session. |
83 | if (!(dialogHandledElsewhere && imSessionID == LLUUID.Zero)) | 83 | if (!(dialogHandledElsewhere && imSessionID == LLUUID.Zero)) |
84 | { | 84 | { |
85 | // Try root avatar only first | ||
85 | foreach (Scene scene in m_scenes) | 86 | foreach (Scene scene in m_scenes) |
86 | { | 87 | { |
87 | if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence) | 88 | if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence) |
@@ -98,8 +99,27 @@ namespace OpenSim.Region.Environment.Modules | |||
98 | } | 99 | } |
99 | } | 100 | } |
100 | } | 101 | } |
102 | |||
103 | // try child avatar second | ||
104 | foreach (Scene scene in m_scenes) | ||
105 | { | ||
106 | if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence) | ||
107 | { | ||
108 | // Local message | ||
109 | ScenePresence user = (ScenePresence)scene.Entities[toAgentID]; | ||
110 | |||
111 | user.ControllingClient.SendInstantMessage(fromAgentID, fromAgentSession, message, | ||
112 | toAgentID, imSessionID, fromAgentName, dialog, | ||
113 | timestamp); | ||
114 | // Message sent | ||
115 | return; | ||
116 | |||
117 | } | ||
118 | } | ||
119 | |||
101 | } | 120 | } |
102 | 121 | ||
122 | |||
103 | // Still here, try send via Grid | 123 | // Still here, try send via Grid |
104 | // TODO | 124 | // TODO |
105 | } | 125 | } |