llavataractions.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:16k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llavataractions.cpp
  3.  * @brief Friend-related actions (add, remove, offer teleport, etc)
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llavataractions.h"
  34. #include "llsd.h"
  35. #include "lldarray.h"
  36. #include "llnotifications.h"
  37. #include "llnotificationsutil.h"
  38. #include "roles_constants.h"    // for GP_MEMBER_INVITE
  39. #include "llagent.h"
  40. #include "llappviewer.h" // for gLastVersionChannel
  41. #include "llcachename.h"
  42. #include "llcallingcard.h" // for LLAvatarTracker
  43. #include "llfloatergroupinvite.h"
  44. #include "llfloatergroups.h"
  45. #include "llfloaterreg.h"
  46. #include "llfloaterpay.h"
  47. #include "llinventorymodel.h" // for gInventory.findCategoryUUIDForType
  48. #include "llimview.h" // for gIMMgr
  49. #include "llmutelist.h"
  50. #include "llrecentpeople.h"
  51. #include "llsidetray.h"
  52. #include "lltrans.h"
  53. #include "llviewerobjectlist.h"
  54. #include "llviewermessage.h" // for handle_lure
  55. #include "llviewerregion.h"
  56. #include "llimfloater.h"
  57. #include "lltrans.h"
  58. #include "llcallingcard.h"
  59. // static
  60. void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)
  61. {
  62. if(id == gAgentID)
  63. {
  64. LLNotificationsUtil::add("AddSelfFriend");
  65. return;
  66. }
  67. LLSD args;
  68. args["NAME"] = name;
  69. LLSD payload;
  70. payload["id"] = id;
  71. payload["name"] = name;
  72.     // Look for server versions like: Second Life Server 1.24.4.95600
  73. if (gLastVersionChannel.find(" 1.24.") != std::string::npos)
  74. {
  75. // Old and busted server version, doesn't support friend
  76. // requests with messages.
  77.      LLNotificationsUtil::add("AddFriend", args, payload, &callbackAddFriend);
  78. }
  79. else
  80. {
  81.      LLNotificationsUtil::add("AddFriendWithMessage", args, payload, &callbackAddFriendWithMessage);
  82. }
  83. // add friend to recent people list
  84. LLRecentPeople::instance().add(id);
  85. }
  86. // static
  87. void LLAvatarActions::requestFriendshipDialog(const LLUUID& id)
  88. {
  89. if(id.isNull())
  90. {
  91. return;
  92. }
  93. std::string full_name;
  94. gCacheName->getFullName(id, full_name);
  95. requestFriendshipDialog(id, full_name);
  96. }
  97. // static
  98. void LLAvatarActions::removeFriendDialog(const LLUUID& id)
  99. {
  100. if (id.isNull())
  101. return;
  102. std::vector<LLUUID> ids;
  103. ids.push_back(id);
  104. removeFriendsDialog(ids);
  105. }
  106. // static
  107. void LLAvatarActions::removeFriendsDialog(const std::vector<LLUUID>& ids)
  108. {
  109. if(ids.size() == 0)
  110. return;
  111. LLSD args;
  112. std::string msgType;
  113. if(ids.size() == 1)
  114. {
  115. LLUUID agent_id = ids[0];
  116. std::string first, last;
  117. if(gCacheName->getName(agent_id, first, last))
  118. {
  119. args["FIRST_NAME"] = first;
  120. args["LAST_NAME"] = last;
  121. }
  122. msgType = "RemoveFromFriends";
  123. }
  124. else
  125. {
  126. msgType = "RemoveMultipleFromFriends";
  127. }
  128. LLSD payload;
  129. for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
  130. {
  131. payload["ids"].append(*it);
  132. }
  133. LLNotificationsUtil::add(msgType,
  134. args,
  135. payload,
  136. &handleRemove);
  137. }
  138. // static
  139. void LLAvatarActions::offerTeleport(const LLUUID& invitee)
  140. {
  141. if (invitee.isNull())
  142. return;
  143. LLDynamicArray<LLUUID> ids;
  144. ids.push_back(invitee);
  145. offerTeleport(ids);
  146. }
  147. // static
  148. void LLAvatarActions::offerTeleport(const std::vector<LLUUID>& ids) 
  149. {
  150. if (ids.size() == 0)
  151. return;
  152. handle_lure(ids);
  153. }
  154. // static
  155. void LLAvatarActions::startIM(const LLUUID& id)
  156. {
  157. if (id.isNull())
  158. return;
  159. std::string name;
  160. if (!gCacheName->getFullName(id, name))
  161. {
  162. gCacheName->get(id, FALSE, boost::bind(&LLAvatarActions::startIM, id));
  163. return;
  164. }
  165. LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
  166. if (session_id != LLUUID::null)
  167. {
  168. LLIMFloater::show(session_id);
  169. }
  170. make_ui_sound("UISndStartIM");
  171. }
  172. // static
  173. void LLAvatarActions::endIM(const LLUUID& id)
  174. {
  175. if (id.isNull())
  176. return;
  177. LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, id);
  178. if (session_id != LLUUID::null)
  179. {
  180. gIMMgr->leaveSession(session_id);
  181. }
  182. }
  183. // static
  184. void LLAvatarActions::startCall(const LLUUID& id)
  185. {
  186. if (id.isNull())
  187. {
  188. return;
  189. }
  190. std::string name;
  191. gCacheName->getFullName(id, name);
  192. LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id, true);
  193. if (session_id != LLUUID::null)
  194. {
  195. gIMMgr->startCall(session_id);
  196. }
  197. make_ui_sound("UISndStartIM");
  198. }
  199. // static
  200. void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
  201. {
  202. if (ids.size() == 0)
  203. {
  204. return;
  205. }
  206. // convert vector into LLDynamicArray for addSession
  207. LLDynamicArray<LLUUID> id_array;
  208. for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
  209. {
  210. id_array.push_back(*it);
  211. }
  212. // create the new ad hoc voice session
  213. const std::string title = LLTrans::getString("conference-title");
  214. LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
  215.    ids[0], id_array, true);
  216. if (session_id == LLUUID::null)
  217. {
  218. return;
  219. }
  220. gIMMgr->autoStartCallOnStartup(session_id);
  221. make_ui_sound("UISndStartIM");
  222. }
  223. /* AD *TODO: Is this function needed any more?
  224. I fixed it a bit(added check for canCall), but it appears that it is not used
  225. anywhere. Maybe it should be removed?
  226. // static
  227. bool LLAvatarActions::isCalling(const LLUUID &id)
  228. {
  229. if (id.isNull() || !canCall())
  230. {
  231. return false;
  232. }
  233. LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, id);
  234. return (LLIMModel::getInstance()->findIMSession(session_id) != NULL);
  235. }*/
  236. //static
  237. bool LLAvatarActions::canCall()
  238. {
  239. return LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
  240. }
  241. // static
  242. void LLAvatarActions::startConference(const std::vector<LLUUID>& ids)
  243. {
  244. // *HACK: Copy into dynamic array
  245. LLDynamicArray<LLUUID> id_array;
  246. for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
  247. {
  248. id_array.push_back(*it);
  249. }
  250. const std::string title = LLTrans::getString("conference-title");
  251. LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START, ids[0], id_array);
  252. if (session_id != LLUUID::null)
  253. {
  254. LLIMFloater::show(session_id);
  255. }
  256. make_ui_sound("UISndStartIM");
  257. }
  258. // static
  259. void LLAvatarActions::showProfile(const LLUUID& id)
  260. {
  261. if (id.notNull())
  262. {
  263. LLSD params;
  264. params["id"] = id;
  265. params["open_tab_name"] = "panel_profile";
  266. //Show own profile
  267. if(gAgent.getID() == id)
  268. {
  269. LLSideTray::getInstance()->showPanel("panel_me", params);
  270. }
  271. //Show other user profile
  272. else
  273. {
  274. LLSideTray::getInstance()->showPanel("panel_profile_view", params);
  275. }
  276. }
  277. }
  278. // static
  279. void LLAvatarActions::pay(const LLUUID& id)
  280. {
  281. LLNotification::Params params("BusyModePay");
  282. params.functor.function(boost::bind(&LLAvatarActions::handlePay, _1, _2, id));
  283. if (gAgent.getBusy())
  284. {
  285. // warn users of being in busy mode during a transaction
  286. LLNotifications::instance().add(params);
  287. }
  288. else
  289. {
  290. LLNotifications::instance().forceResponse(params, 1);
  291. }
  292. }
  293. // static
  294. void LLAvatarActions::kick(const LLUUID& id)
  295. {
  296. LLSD payload;
  297. payload["avatar_id"] = id;
  298. LLNotifications::instance().add("KickUser", LLSD(), payload, handleKick);
  299. }
  300. // static
  301. void LLAvatarActions::freeze(const LLUUID& id)
  302. {
  303. LLSD payload;
  304. payload["avatar_id"] = id;
  305. LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze);
  306. }
  307. // static
  308. void LLAvatarActions::unfreeze(const LLUUID& id)
  309. {
  310. LLSD payload;
  311. payload["avatar_id"] = id;
  312. LLNotifications::instance().add("UnFreezeUser", LLSD(), payload, handleUnfreeze);
  313. }
  314. //static 
  315. void LLAvatarActions::csr(const LLUUID& id, std::string name)
  316. {
  317. if (name.empty()) return;
  318. std::string url = "http://csr.lindenlab.com/agent/";
  319. // slow and stupid, but it's late
  320. S32 len = name.length();
  321. for (S32 i = 0; i < len; i++)
  322. {
  323. if (name[i] == ' ')
  324. {
  325. url += "%20";
  326. }
  327. else
  328. {
  329. url += name[i];
  330. }
  331. }
  332. LLWeb::loadURL(url);
  333. }
  334. //static 
  335. void LLAvatarActions::share(const LLUUID& id)
  336. {
  337. LLSD key;
  338. LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
  339. LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,id);
  340. if (!gIMMgr->hasSession(session_id))
  341. {
  342. startIM(id);
  343. }
  344. if (gIMMgr->hasSession(session_id))
  345. {
  346. // we should always get here, but check to verify anyways
  347. LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, LLTrans::getString("share_alert"), false);
  348. }
  349. }
  350. // static
  351. void LLAvatarActions::toggleBlock(const LLUUID& id)
  352. {
  353. std::string name;
  354. gCacheName->getFullName(id, name);
  355. LLMute mute(id, name, LLMute::AGENT);
  356. if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName))
  357. {
  358. LLMuteList::getInstance()->remove(mute);
  359. }
  360. else
  361. {
  362. LLMuteList::getInstance()->add(mute);
  363. }
  364. }
  365. void LLAvatarActions::inviteToGroup(const LLUUID& id)
  366. {
  367. LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(id));
  368. if (widget)
  369. {
  370. widget->center();
  371. widget->setPowersMask(GP_MEMBER_INVITE);
  372. widget->removeNoneOption();
  373. widget->setSelectGroupCallback(boost::bind(callback_invite_to_group, _1, id));
  374. }
  375. }
  376. //== private methods ========================================================================================
  377. // static
  378. bool LLAvatarActions::handleRemove(const LLSD& notification, const LLSD& response)
  379. {
  380. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  381. const LLSD& ids = notification["payload"]["ids"];
  382. for (LLSD::array_const_iterator itr = ids.beginArray(); itr != ids.endArray(); ++itr)
  383. {
  384. LLUUID id = itr->asUUID();
  385. const LLRelationship* ip = LLAvatarTracker::instance().getBuddyInfo(id);
  386. if (ip)
  387. {
  388. switch (option)
  389. {
  390. case 0: // YES
  391. if( ip->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS))
  392. {
  393. LLAvatarTracker::instance().empower(id, FALSE);
  394. LLAvatarTracker::instance().notifyObservers();
  395. }
  396. LLAvatarTracker::instance().terminateBuddy(id);
  397. LLAvatarTracker::instance().notifyObservers();
  398. break;
  399. case 1: // NO
  400. default:
  401. llinfos << "No removal performed." << llendl;
  402. break;
  403. }
  404. }
  405. }
  406. return false;
  407. }
  408. // static
  409. bool LLAvatarActions::handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id)
  410. {
  411. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  412. if (option == 0)
  413. {
  414. gAgent.clearBusy();
  415. }
  416. LLFloaterPayUtil::payDirectly(&give_money, avatar_id, /*is_group=*/false);
  417. return false;
  418. }
  419. // static
  420. void LLAvatarActions::callback_invite_to_group(LLUUID group_id, LLUUID id)
  421. {
  422. std::vector<LLUUID> agent_ids;
  423. agent_ids.push_back(id);
  424. LLFloaterGroupInvite::showForGroup(group_id, &agent_ids);
  425. }
  426. // static
  427. bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response)
  428. {
  429. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  430. if (option == 0)
  431. {
  432. requestFriendship(notification["payload"]["id"].asUUID(), 
  433.     notification["payload"]["name"].asString(),
  434.     response["message"].asString());
  435. }
  436. return false;
  437. }
  438. // static
  439. bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response)
  440. {
  441. S32 option = LLNotification::getSelectedOption(notification, response);
  442. if (option == 0)
  443. {
  444. LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
  445. LLMessageSystem* msg = gMessageSystem;
  446. msg->newMessageFast(_PREHASH_GodKickUser);
  447. msg->nextBlockFast(_PREHASH_UserInfo);
  448. msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() );
  449. msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
  450. msg->addUUIDFast(_PREHASH_AgentID,   avatar_id );
  451. msg->addU32("KickFlags", KICK_FLAGS_DEFAULT );
  452. msg->addStringFast(_PREHASH_Reason,    response["message"].asString() );
  453. gAgent.sendReliableMessage();
  454. }
  455. return false;
  456. }
  457. bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
  458. {
  459. S32 option = LLNotification::getSelectedOption(notification, response);
  460. if (option == 0)
  461. {
  462. LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
  463. LLMessageSystem* msg = gMessageSystem;
  464. msg->newMessageFast(_PREHASH_GodKickUser);
  465. msg->nextBlockFast(_PREHASH_UserInfo);
  466. msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() );
  467. msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
  468. msg->addUUIDFast(_PREHASH_AgentID,   avatar_id );
  469. msg->addU32("KickFlags", KICK_FLAGS_FREEZE );
  470. msg->addStringFast(_PREHASH_Reason, response["message"].asString() );
  471. gAgent.sendReliableMessage();
  472. }
  473. return false;
  474. }
  475. bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response)
  476. {
  477. S32 option = LLNotification::getSelectedOption(notification, response);
  478. std::string text = response["message"].asString();
  479. if (option == 0)
  480. {
  481. LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
  482. LLMessageSystem* msg = gMessageSystem;
  483. msg->newMessageFast(_PREHASH_GodKickUser);
  484. msg->nextBlockFast(_PREHASH_UserInfo);
  485. msg->addUUIDFast(_PREHASH_GodID, gAgent.getID() );
  486. msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
  487. msg->addUUIDFast(_PREHASH_AgentID,   avatar_id );
  488. msg->addU32("KickFlags", KICK_FLAGS_UNFREEZE );
  489. msg->addStringFast(_PREHASH_Reason,    text );
  490. gAgent.sendReliableMessage();
  491. }
  492. return false;
  493. }
  494. // static
  495. bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& response)
  496. {
  497. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  498. if (option == 0)
  499. {
  500. // Servers older than 1.25 require the text of the message to be the
  501. // calling card folder ID for the offering user. JC
  502. LLUUID calling_card_folder_id = 
  503. gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
  504. std::string message = calling_card_folder_id.asString();
  505. requestFriendship(notification["payload"]["id"].asUUID(), 
  506.     notification["payload"]["name"].asString(),
  507.     message);
  508. }
  509.     return false;
  510. }
  511. // static
  512. void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message)
  513. {
  514. const LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
  515. send_improved_im(target_id,
  516.  target_name,
  517.  message,
  518.  IM_ONLINE,
  519.  IM_FRIENDSHIP_OFFERED,
  520.  calling_card_folder_id);
  521. LLSD args;
  522. args["TO_NAME"] = target_name;
  523. LLSD payload;
  524. payload["from_id"] = target_id;
  525. payload["SESSION_NAME"] = target_name;
  526. payload["SUPPRESS_TOAST"] = true;
  527. LLNotificationsUtil::add("FriendshipOffered", args, payload);
  528. }
  529. //static
  530. bool LLAvatarActions::isFriend(const LLUUID& id)
  531. {
  532. return ( NULL != LLAvatarTracker::instance().getBuddyInfo(id) );
  533. }
  534. // static
  535. bool LLAvatarActions::isBlocked(const LLUUID& id)
  536. {
  537. std::string name;
  538. gCacheName->getFullName(id, name);
  539. return LLMuteList::getInstance()->isMuted(id, name);
  540. }
  541. // static
  542. bool LLAvatarActions::canBlock(const LLUUID& id)
  543. {
  544. std::string firstname, lastname;
  545. gCacheName->getName(id, firstname, lastname);
  546. bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden");
  547. bool is_self = id == gAgentID;
  548. return !is_self && !is_linden;
  549. }