bbb.lib.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. <?php
  2. /**
  3. * This file contains the helper libraries for the BigBlueButton conference plugin.
  4. * It is based on code written by Dual Code Inc in GNU/GPLv2
  5. * Copyright (C) 2010 Dual Code Inc. (www.dualcode.com)
  6. * Copyright (C) 2010 BeezNest Belgium SPRL (www.beeznest.com) - Yannick Warnier - y@beeznest.com
  7. * @package chamilo.plugin.bigbluebutton
  8. */
  9. /**
  10. * Inserts an item into the plugin_bbb table
  11. */
  12. function bigbluebutton_insert_record($table,$object) {
  13. //ignore the first param (used for compatibility with existing code)
  14. $table = Database::get_main_table('plugin_bbb');
  15. $sql = "INSERT INTO $table (course_id, name, meeting_name, meeting_id, attendee_pw, moderator_pw, auto_login, new_window, welcome_msg)" .
  16. "VALUES (" .
  17. intval($object->course) .", " .
  18. "'".Database::escape_string($object->name)."'," .
  19. "'".Database::escape_string($object->meetingname)."'," .
  20. "'".Database::escape_string($object->meetingid)."'," .
  21. "'".Database::escape_string($object->attendeepw)."'," .
  22. "'".Database::escape_string($object->moderatorpw)."'," .
  23. "'".Database::escape_string($object->autologin)."'," .
  24. "'".Database::escape_string($object->newwindow)."'," .
  25. "'".Database::escape_string($object->welcomemsg)."'" .
  26. ")";
  27. Database::query($sql);
  28. return Database::insert_id();
  29. }
  30. /**
  31. * Updates a bigbluebutton record
  32. */
  33. function bigbluebutton_update_record($table, $object) {
  34. //ignore the first param (used for compatibility with existing code) $table = Database::get_main_table('plugin_bbb');
  35. $sql = "UPDATE $table (course_id, name, meeting_name, meeting_id, attendee_pw, moderator_pw, auto_login, new_window, welcome_msg)" .
  36. " SET course_id = ".intval($object->course) .", " .
  37. " name = '".Database::escape_string($object->name)."'," .
  38. " meeting_name = '".Database::escape_string($object->meetingname)."'," .
  39. " meeting_id = '".Database::escape_string($object->meetingid)."'," .
  40. " attendee_pw = '".Database::escape_string($object->attendeepw)."'," .
  41. " moderator_pw = '".Database::escape_string($object->moderatorpw)."'," .
  42. " auto_login = '".Database::escape_string($object->autologin)."'," .
  43. " new_window = '".Database::escape_string($object->newwindow)."'," .
  44. " welcome_msg = '".Database::escape_string($object->welcomemsg)."'," .
  45. " WHERE id = " .intval($object->id).
  46. ")";
  47. Database::query($sql);
  48. return $oject->id;
  49. }
  50. /**
  51. * Gets a bigbluebutton room record from an ID
  52. */
  53. function bigbluebutton_get_record($table,$field,$id) {
  54. //ignore the first param (used for compatibility with existing code)
  55. $table = Database::get_main_table('plugin_bbb');
  56. $sql = "SELECT * FROM $table WHERE id = ".intval($id);
  57. $res = Database::query($sql);
  58. if (Database::num_rows($res)>0) {
  59. $row = Database::fetch_assoc($res);
  60. $room = null;
  61. $room->id = $id;
  62. $room->course = $row['course_id'];
  63. $room->name = $row['name'];
  64. $room->meetingname = $row['meeting_name'];
  65. $room->meetingid = $row['meeting_id'];
  66. $room->attendeepw = $row['attendee_pw'];
  67. $room->moderatorpw = $row['moderator_pw'];
  68. $room->autologin = $row['auto_login'];
  69. $room->newwindow = $row['new_window'];
  70. $room->welcomemsg = $row['welcome_msg'];
  71. return $room;
  72. } else {
  73. return null;
  74. }
  75. }
  76. /**
  77. * Gets a bigbluebutton room record from an ID
  78. */
  79. function bigbluebutton_delete_records($table,$field,$id) {
  80. //ignore the first param (used for compatibility with existing code)
  81. $table = Database::get_main_table('plugin_bbb');
  82. $sql = "DELETE FROM $table WHERE id = ".intval($id);
  83. }
  84. /**
  85. * Add an event
  86. */
  87. function bigbluebutton_add_event($event) {
  88. //
  89. }
  90. /**
  91. * Given an object containing all the necessary data,
  92. * (defined by the form in mod.html) this function
  93. * will create a new instance and return the id number
  94. * of the new instance.
  95. */
  96. function bigbluebutton_add_instance($bigbluebutton) {
  97. $bigbluebutton->timemodified = time();
  98. if ($returnid = bigbluebutton_insert_record('bigbluebutton', $bigbluebutton)) {
  99. $event = NULL;
  100. $event->courseid = $bigbluebutton->course;
  101. $event->name = $bigbluebutton->name;
  102. $event->meetingname = $bigbluebutton->meetingname;
  103. $event->meetingid = $bigbluebutton->meetingid;
  104. $event->attendeepw = $bigbluebutton->attendeepw;
  105. $event->moderatorpw = $bigbluebutton->moderatorpw;
  106. $event->autologin = $bigbluebutton->autologin;
  107. $event->newwindow = $bigbluebutton->newwindow;
  108. $event->welcomemsg = $bigbluebutton->welcomemsg;
  109. bigbluebutton_add_event($event);
  110. }
  111. return $returnid;
  112. }
  113. /**
  114. * Given an object containing all the necessary data,
  115. * (defined by the form in mod.html) this function
  116. * will update an existing instance with new data.
  117. */
  118. function bigbluebutton_update_instance($bigbluebutton) {
  119. $bigbluebutton->timemodified = time();
  120. $bigbluebutton->id = $bigbluebutton->instance;
  121. if ($returnid = bigbluebutton_update_record('bigbluebutton', $bigbluebutton)) {
  122. /*
  123. $event = NULL;
  124. if ($event->id = bigbluebutton_get_field('event', 'id', 'modulename', 'bigbluebutton', 'instance', $bigbluebutton->id)) {
  125. $event->courseid = $bigbluebutton->course;
  126. $event->name = $bigbluebutton->name;
  127. $event->meetingname = $bigbluebutton->meetingname;
  128. $event->meetingid = $bigbluebutton->meetingid;
  129. $event->attendeepw = $bigbluebutton->attendeepw;
  130. $event->moderatorpw = $bigbluebutton->moderatorpw;
  131. $event->autologin = $bigbluebutton->autologin;
  132. $event->newwindow = $bigbluebutton->newwindow;
  133. $event->welcomemsg = $bigbluebutton->welcomemsg;
  134. bigbluebutton_update_event($event);
  135. }*/
  136. }
  137. return $returnid;
  138. }
  139. /**
  140. * Given an ID of an instance of this module,
  141. * this function will permanently delete the instance
  142. * and any data that depends on it.
  143. */
  144. function bigbluebutton_delete_instance($id) {
  145. if (! $bigbluebutton = bigbluebutton_get_record('bigbluebutton', 'id', $id)) {
  146. return false;
  147. }
  148. $result = true;
  149. # Delete any dependent records here #
  150. if (! bigbluebutton_delete_records('bigbluebutton', 'id', $bigbluebutton->id)) {
  151. $result = false;
  152. }
  153. /*
  154. $pagetypes = page_import_types('mod/bigbluebutton/');
  155. foreach($pagetypes as $pagetype) {
  156. if(!delete_records('block_instance', 'pageid', $bigbluebutton->id, 'pagetype', $pagetype)) {
  157. $result = false;
  158. }
  159. }
  160. */
  161. /*
  162. if (! bigbluebutton_delete_records('event', 'modulename', 'bigbluebutton', 'instance', $bigbluebutton->id)) {
  163. $result = false;
  164. }
  165. */
  166. return $result;
  167. }
  168. /**
  169. * Create string where we check if the meeting is running
  170. */
  171. function wc_isMeetingRunningURL($myIP,$mySecuritySalt,$myMeetingID) {
  172. $checkAPI = "/bigbluebutton/api/isMeetingRunning?";
  173. $queryStr = "meetingID=".$myMeetingID;
  174. $checksum = sha1('isMeetingRunning'.$queryStr.$mySecuritySalt);
  175. $secQueryURL = "http://".$myIP.$checkAPI.$queryStr."&checksum=".$checksum;
  176. return $secQueryURL;
  177. }
  178. /**
  179. * Determine if the meeting is already running (e.g. has attendees in it)
  180. */
  181. function wc_isMeetingRunning($myIP,$mySecuritySalt,$myMeetingID) {
  182. $secQueryURL = wc_isMeetingRunningURL($myIP,$mySecuritySalt,$myMeetingID);
  183. $myResponse = @file_get_contents($secQueryURL);
  184. if ($myResponse === false) { return false;}
  185. $doc = new DOMDocument();
  186. $doc->loadXML($myResponse);
  187. $returnCodeNode = $doc->getElementsByTagName("returncode");
  188. $returnCode = $returnCodeNode->item(0)->nodeValue;
  189. $runningNode = $doc->getElementsByTagName("running");
  190. $isRunning = $runningNode->item(0)->nodeValue;
  191. return $isRunning;
  192. }
  193. /**
  194. * Create meeting if it's not already running
  195. */
  196. function wc_createMeeting($myIP,$mySecuritySalt,$myMeetingName,$myMeetingID,$myAttendeePW,$myModeratorPW,$myWelcomeMsg,$myLogoutURL) {
  197. $createAPI = "/bigbluebutton/api/create?";
  198. $myVoiceBridge = rand(70000,79999);
  199. $queryStr = "name=".urlencode($myMeetingName)."&meetingID=".urlencode($myMeetingID)."&attendeePW=".urlencode($myAttendeePW)."&moderatorPW=".urlencode($myModeratorPW)."&voiceBridge=".$myVoiceBridge."&welcome=".urlencode($myWelcomeMsg)."&logoutURL=".urlencode($myLogoutURL);
  200. $checksum = sha1('create'.$queryStr.$mySecuritySalt);
  201. $secQueryURL = "http://".$myIP.$createAPI.$queryStr."&checksum=".$checksum;
  202. $myResponse = @file_get_contents($secQueryURL);
  203. if ($myResponse === false) { return false; }
  204. $doc= new DOMDocument();
  205. $doc->loadXML($myResponse);
  206. $returnCodeNode = $doc->getElementsByTagName("returncode");
  207. $returnCode = $returnCodeNode->item(0)->nodeValue;
  208. if ($returnCode=="SUCCESS") {
  209. return $returnCode;
  210. } else {
  211. $messageKeyNode = $doc->getElementsByTagName("messageKey");
  212. $messageKey = $messageKeyNode->item(0)->nodeValue;
  213. return $messageKey;
  214. }
  215. }
  216. /**
  217. * Create a URL to join the meeting
  218. */
  219. function wc_joinMeetingURL($myIP,$mySecuritySalt,$myName,$myMeetingID,$myPassword,$userID) {
  220. $joinAPI = "/bigbluebutton/api/join?";
  221. $queryStr = "fullName=".urlencode($myName)."&meetingID=".urlencode($myMeetingID)."&password=".urlencode($myPassword)."&userID=".$userID;
  222. $checksum = sha1('join'.$queryStr.$mySecuritySalt);
  223. $createStr = "http://".$myIP.$joinAPI.$queryStr."&checksum=".$checksum;
  224. return $createStr;
  225. }
  226. /**
  227. * This API is not yet supported in bigbluebutton
  228. */
  229. function wc_endMeeting($myIP,$mySecuritySalt,$myMeetingID,$myModeratorPW) {
  230. $endAPI = "/bigbluebutton/api/end?";
  231. $myVoiceBridge = rand(70000,79999);
  232. $queryStr = "meetingID=".$myMeetingID."&moderatorPW=".$myModeratorPW."&voiceBridge=".$myVoiceBridge;
  233. $checksum = sha1('create'.$queryStr.$mySecuritySalt);
  234. $secQueryURL = "http://".$myIP.$endAPI.$queryStr."&checksum=".$checksum;
  235. $myResponse = @file_get_contents($secQueryURL);
  236. if ($myResponse === false) { return false; }
  237. $doc= new DOMDocument();
  238. $doc->loadXML($myResponse);
  239. $returnCodeNode = $doc->getElementsByTagName("returncode");
  240. $returnCode = $returnCodeNode->item(0)->nodeValue;
  241. if ($returnCode=="SUCCESS") {
  242. return $returnCode;
  243. } else {
  244. $messageKeyNode = $doc->getElementsByTagName("messageKey");
  245. $messageKey = $messageKeyNode->item(0)->nodeValue;
  246. return $messageKey;
  247. }
  248. }
  249. /**
  250. * This API is not yet supported in bigbluebutton
  251. */
  252. function wc_listAttendees() {
  253. return false;
  254. }
  255. /**
  256. * This API is not yet supported in bigbluebutton
  257. */
  258. function wc_getMeetingInfo($myIP,$mySecuritySalt,$meetingID,$modPW) {
  259. $checkAPI = "/bigbluebutton/api/getMeetingInfo?";
  260. $queryStr = 'meetingID='.$meetingID.'&password='.$modPW;
  261. $checksum = sha1('getMeetingInfo'.$queryStr.$mySecuritySalt);
  262. $secQueryURL = "http://".$myIP.$checkAPI.$queryStr."&checksum=".$checksum;
  263. $myResponse = @file_get_contents($secQueryURL);
  264. if ($myResponse === false) { return false;}
  265. $doc = new DOMDocument();
  266. $doc->loadXML($myResponse);
  267. $returnCodeNode = $doc->getElementsByTagName("returncode");
  268. $returnCode = $returnCodeNode->item(0)->nodeValue;
  269. $createTimeNode = $doc->getElementsByTagName("createTime");
  270. $createTime = $createTimeNode->item(0)->nodeValue;
  271. $runningNode = $doc->getElementsByTagName("running");
  272. $running = $runningNode->item(0)->nodeValue;
  273. $attendeesNode = $doc->getElementsByTagName("attendee");
  274. $attendees = array();
  275. foreach ($attendeesNode as $attendeeNode) {
  276. $attendee = array();
  277. if ($attendeeNode->childNodes->length) {
  278. foreach ($attendeeNode->childNodes as $i) {
  279. //see http://code.google.com/p/bigbluebutton/wiki/API#Get_Meeting_Info for details
  280. $attendee[$i->nodeName] = $i->nodeValue;
  281. }
  282. }
  283. $attendees[] = $attendee;
  284. }
  285. $info = array('returnCode'=>$returnCode,'createTime'=>$createTime,'attendees'=>$attendees,'running'=>$running);
  286. return $info;
  287. }
  288. /**
  289. * Determine the URL of the current page (for logoutURL)
  290. */
  291. function wc_currentPageURL() {
  292. $isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on");
  293. $port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443")));
  294. $port = ($port) ? ':'.$_SERVER["SERVER_PORT"] : '';
  295. $pageURL = ($isHTTPS ? 'https://' : 'http://').$_SERVER["SERVER_NAME"].$port.$_SERVER["REQUEST_URI"];
  296. return $pageURL;
  297. }
  298. /**
  299. * Determine the IP/Domain of the current Corporate University
  300. */
  301. function wc_currentDomain() {
  302. $currentDomain = $_SERVER["SERVER_NAME"];
  303. return $currentDomain;
  304. }
  305. /**
  306. * Determine if a new version of the plug-in is available
  307. */
  308. function wc_needUpgrade() {
  309. $returnValue = false;
  310. $installedVersion = "20100805";
  311. $availableVersion = dc_getVersion();
  312. if ((int)$installedVersion < (int)$availableVersion) {
  313. $returnValue = true;
  314. }
  315. return $returnValue;
  316. }
  317. /**
  318. * Gets a list of all meetings currently running
  319. */
  320. function wc_getRunningMeetings($myIP,$mySecuritySalt) {
  321. $checkAPI = "/bigbluebutton/api/getMeetings?";
  322. $queryStr = '';
  323. $checksum = sha1('getMeetings'.$queryStr.$mySecuritySalt);
  324. $secQueryURL = "http://".$myIP.$checkAPI.$queryStr."&checksum=".$checksum;
  325. $myResponse = @file_get_contents($secQueryURL);
  326. if ($myResponse === false) { return false;}
  327. $doc = new DOMDocument();
  328. $doc->loadXML($myResponse);
  329. $returnCodeNode = $doc->getElementsByTagName("returncode");
  330. $returnCode = $returnCodeNode->item(0)->nodeValue;
  331. $meetingsNode = $doc->getElementsByTagName("meeting");
  332. $meetings = array();
  333. foreach ($meetingsNode as $meetingNode) {
  334. $meeting = array();
  335. if ($meetingNode->childNodes->length) {
  336. foreach ($meetingNode->childNodes as $i) {
  337. //see http://code.google.com/p/bigbluebutton/wiki/API#Get_Meetings for details
  338. $meeting[$i->nodeName] = $i->nodeValue;
  339. }
  340. }
  341. $meetings[] = $meeting;
  342. }
  343. return $meetings;
  344. }