diff options
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Friends/CallingCardModule.cs | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/CallingCardModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/CallingCardModule.cs new file mode 100644 index 0000000..5e2a651 --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/Friends/CallingCardModule.cs | |||
@@ -0,0 +1,286 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Reflection; | ||
4 | using log4net; | ||
5 | using Nini.Config; | ||
6 | using OpenMetaverse; | ||
7 | using OpenSim.Framework; | ||
8 | using OpenSim.Region.Framework.Interfaces; | ||
9 | using OpenSim.Region.Framework.Scenes; | ||
10 | using OpenSim.Services.Interfaces; | ||
11 | using Mono.Addins; | ||
12 | |||
13 | namespace Careminster.XCallingCard.Modules | ||
14 | { | ||
15 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "XCallingCard")] | ||
16 | public class CallingCardModule : ISharedRegionModule, ICallingCardModule | ||
17 | { | ||
18 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
19 | protected List<Scene> m_Scenes = new List<Scene>(); | ||
20 | protected bool m_Enabled = true; | ||
21 | |||
22 | public void Initialise(IConfigSource source) | ||
23 | { | ||
24 | IConfig ccConfig = source.Configs["XCallingCard"]; | ||
25 | if (ccConfig != null) | ||
26 | m_Enabled = ccConfig.GetBoolean("Enabled", true); | ||
27 | } | ||
28 | |||
29 | public void AddRegion(Scene scene) | ||
30 | { | ||
31 | if (!m_Enabled) | ||
32 | return; | ||
33 | |||
34 | m_Scenes.Add(scene); | ||
35 | |||
36 | scene.RegisterModuleInterface<ICallingCardModule>(this); | ||
37 | } | ||
38 | |||
39 | public void RemoveRegion(Scene scene) | ||
40 | { | ||
41 | if (!m_Enabled) | ||
42 | return; | ||
43 | |||
44 | m_Scenes.Remove(scene); | ||
45 | |||
46 | scene.EventManager.OnNewClient -= OnNewClient; | ||
47 | scene.EventManager.OnIncomingInstantMessage += | ||
48 | OnIncomingInstantMessage; | ||
49 | |||
50 | scene.UnregisterModuleInterface<ICallingCardModule>(this); | ||
51 | } | ||
52 | |||
53 | public void RegionLoaded(Scene scene) | ||
54 | { | ||
55 | if (!m_Enabled) | ||
56 | return; | ||
57 | scene.EventManager.OnNewClient += OnNewClient; | ||
58 | } | ||
59 | |||
60 | public void PostInitialise() | ||
61 | { | ||
62 | } | ||
63 | |||
64 | public void Close() | ||
65 | { | ||
66 | } | ||
67 | |||
68 | public Type ReplaceableInterface | ||
69 | { | ||
70 | get { return null; } | ||
71 | } | ||
72 | |||
73 | public string Name | ||
74 | { | ||
75 | get { return "XCallingCardModule"; } | ||
76 | } | ||
77 | |||
78 | private void OnNewClient(IClientAPI client) | ||
79 | { | ||
80 | client.OnOfferCallingCard += OnOfferCallingCard; | ||
81 | client.OnAcceptCallingCard += OnAcceptCallingCard; | ||
82 | client.OnDeclineCallingCard += OnDeclineCallingCard; | ||
83 | } | ||
84 | |||
85 | private void OnOfferCallingCard(IClientAPI client, UUID destID, UUID transactionID) | ||
86 | { | ||
87 | ScenePresence sp = GetClientPresence(client.AgentId); | ||
88 | if (sp != null) | ||
89 | { | ||
90 | // If we're in god mode, we reverse the meaning. Offer | ||
91 | // calling card becomes "Take a calling card" for that | ||
92 | // person, no matter if they agree or not. | ||
93 | if (sp.GodLevel >= 200) | ||
94 | { | ||
95 | CreateCallingCard(client.AgentId, destID, UUID.Zero, true); | ||
96 | return; | ||
97 | } | ||
98 | } | ||
99 | |||
100 | IClientAPI dest = FindClientObject(destID); | ||
101 | if (dest != null) | ||
102 | { | ||
103 | DoCallingCardOffer(dest, client.AgentId); | ||
104 | return; | ||
105 | } | ||
106 | |||
107 | IMessageTransferModule transferModule = | ||
108 | m_Scenes[0].RequestModuleInterface<IMessageTransferModule>(); | ||
109 | |||
110 | if (transferModule != null) | ||
111 | { | ||
112 | transferModule.SendInstantMessage(new GridInstantMessage( | ||
113 | client.Scene, client.AgentId, | ||
114 | client.FirstName+" "+client.LastName, | ||
115 | destID, (byte)211, false, | ||
116 | String.Empty, | ||
117 | transactionID, false, new Vector3(), new byte[0]), | ||
118 | delegate(bool success) {} ); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | private void DoCallingCardOffer(IClientAPI dest, UUID from) | ||
123 | { | ||
124 | UUID itemID = CreateCallingCard(dest.AgentId, from, UUID.Zero, false); | ||
125 | |||
126 | dest.SendOfferCallingCard(from, itemID); | ||
127 | } | ||
128 | |||
129 | // Create a calling card in the user's inventory. This is called | ||
130 | // from direct calling card creation, when the offer is forwarded, | ||
131 | // and from the friends module when the friend is confirmed. | ||
132 | // Because of the latter, it will send a bulk inventory update | ||
133 | // if the receiving user is in the same simulator. | ||
134 | public UUID CreateCallingCard(UUID userID, UUID creatorID, UUID folderID) | ||
135 | { | ||
136 | return CreateCallingCard(userID, creatorID, folderID, false); | ||
137 | } | ||
138 | |||
139 | private UUID CreateCallingCard(UUID userID, UUID creatorID, UUID folderID, bool isGod) | ||
140 | { | ||
141 | IUserAccountService userv = m_Scenes[0].UserAccountService; | ||
142 | if (userv == null) | ||
143 | return UUID.Zero; | ||
144 | |||
145 | UserAccount info = userv.GetUserAccount(UUID.Zero, creatorID); | ||
146 | if (info == null) | ||
147 | return UUID.Zero; | ||
148 | |||
149 | IInventoryService inv = m_Scenes[0].InventoryService; | ||
150 | if (inv == null) | ||
151 | return UUID.Zero; | ||
152 | |||
153 | if (folderID == UUID.Zero) | ||
154 | { | ||
155 | InventoryFolderBase folder = inv.GetFolderForType(userID, | ||
156 | AssetType.CallingCard); | ||
157 | |||
158 | if (folder == null) // Nowhere to put it | ||
159 | return UUID.Zero; | ||
160 | |||
161 | folderID = folder.ID; | ||
162 | } | ||
163 | |||
164 | m_log.DebugFormat("[XCALLINGCARD]: Creating calling card for {0} in inventory of {1}", info.Name, userID); | ||
165 | |||
166 | InventoryItemBase item = new InventoryItemBase(); | ||
167 | item.AssetID = UUID.Zero; | ||
168 | item.AssetType = (int)AssetType.CallingCard; | ||
169 | item.BasePermissions = (uint)(PermissionMask.Copy | PermissionMask.Modify); | ||
170 | if (isGod) | ||
171 | item.BasePermissions = (uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer | PermissionMask.Move); | ||
172 | |||
173 | item.EveryOnePermissions = (uint)PermissionMask.None; | ||
174 | item.CurrentPermissions = item.BasePermissions; | ||
175 | item.NextPermissions = (uint)(PermissionMask.Copy | PermissionMask.Modify); | ||
176 | |||
177 | item.ID = UUID.Random(); | ||
178 | item.CreatorId = creatorID.ToString(); | ||
179 | item.Owner = userID; | ||
180 | item.GroupID = UUID.Zero; | ||
181 | item.GroupOwned = false; | ||
182 | item.Folder = folderID; | ||
183 | |||
184 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
185 | item.InvType = (int)InventoryType.CallingCard; | ||
186 | item.Flags = 0; | ||
187 | |||
188 | item.Name = info.Name; | ||
189 | item.Description = ""; | ||
190 | |||
191 | item.SalePrice = 10; | ||
192 | item.SaleType = (byte)SaleType.Not; | ||
193 | |||
194 | inv.AddItem(item); | ||
195 | |||
196 | IClientAPI client = FindClientObject(userID); | ||
197 | if (client != null) | ||
198 | client.SendBulkUpdateInventory(item); | ||
199 | |||
200 | return item.ID; | ||
201 | } | ||
202 | |||
203 | private void OnAcceptCallingCard(IClientAPI client, UUID transactionID, UUID folderID) | ||
204 | { | ||
205 | } | ||
206 | |||
207 | private void OnDeclineCallingCard(IClientAPI client, UUID transactionID) | ||
208 | { | ||
209 | IInventoryService invService = m_Scenes[0].InventoryService; | ||
210 | |||
211 | InventoryFolderBase trashFolder = | ||
212 | invService.GetFolderForType(client.AgentId, AssetType.TrashFolder); | ||
213 | |||
214 | InventoryItemBase item = new InventoryItemBase(transactionID, client.AgentId); | ||
215 | item = invService.GetItem(item); | ||
216 | |||
217 | if (item != null && trashFolder != null) | ||
218 | { | ||
219 | item.Folder = trashFolder.ID; | ||
220 | List<UUID> uuids = new List<UUID>(); | ||
221 | uuids.Add(item.ID); | ||
222 | invService.DeleteItems(item.Owner, uuids); | ||
223 | m_Scenes[0].AddInventoryItem(client, item); | ||
224 | } | ||
225 | } | ||
226 | |||
227 | public IClientAPI FindClientObject(UUID agentID) | ||
228 | { | ||
229 | Scene scene = GetClientScene(agentID); | ||
230 | if (scene == null) | ||
231 | return null; | ||
232 | |||
233 | ScenePresence presence = scene.GetScenePresence(agentID); | ||
234 | if (presence == null) | ||
235 | return null; | ||
236 | |||
237 | return presence.ControllingClient; | ||
238 | } | ||
239 | |||
240 | private Scene GetClientScene(UUID agentId) | ||
241 | { | ||
242 | lock (m_Scenes) | ||
243 | { | ||
244 | foreach (Scene scene in m_Scenes) | ||
245 | { | ||
246 | ScenePresence presence = scene.GetScenePresence(agentId); | ||
247 | if (presence != null) | ||
248 | { | ||
249 | if (!presence.IsChildAgent) | ||
250 | return scene; | ||
251 | } | ||
252 | } | ||
253 | } | ||
254 | return null; | ||
255 | } | ||
256 | |||
257 | private ScenePresence GetClientPresence(UUID agentId) | ||
258 | { | ||
259 | lock (m_Scenes) | ||
260 | { | ||
261 | foreach (Scene scene in m_Scenes) | ||
262 | { | ||
263 | ScenePresence presence = scene.GetScenePresence(agentId); | ||
264 | if (presence != null) | ||
265 | { | ||
266 | if (!presence.IsChildAgent) | ||
267 | return presence; | ||
268 | } | ||
269 | } | ||
270 | } | ||
271 | return null; | ||
272 | } | ||
273 | |||
274 | private void OnIncomingInstantMessage(GridInstantMessage msg) | ||
275 | { | ||
276 | if (msg.dialog == (uint)211) | ||
277 | { | ||
278 | IClientAPI client = FindClientObject(new UUID(msg.toAgentID)); | ||
279 | if (client == null) | ||
280 | return; | ||
281 | |||
282 | DoCallingCardOffer(client, new UUID(msg.fromAgentID)); | ||
283 | } | ||
284 | } | ||
285 | } | ||
286 | } | ||