Advertisement
Mister_Magister

asdsadasd

May 28th, 2017
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.64 KB | None | 0 0
  1. #include "messenger_purple.h"
  2.  
  3. #include "purple.h"
  4.  
  5. #include <glib.h>
  6.  
  7. #include <signal.h>
  8. #include <string.h>
  9. #include <unistd.h>
  10. #include <stdio.h>
  11.  
  12. #define CUSTOM_USER_DIRECTORY "/dev/null"
  13. #define CUSTOM_PLUGIN_PATH ""
  14. #define PLUGIN_SAVE_PREF "/purple/sailfish/plugins/saved"
  15. #define UI_ID "sailfish"
  16.  
  17. /**
  18. * The following eventloop functions are used in both pidgin and purple-text. If your
  19. * application uses glib mainloop, you can safely use this verbatim.
  20. */
  21. #define PURPLE_GLIB_READ_COND (G_IO_IN | G_IO_HUP | G_IO_ERR)
  22. #define PURPLE_GLIB_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL)
  23.  
  24. typedef struct _PurpleGLibIOClosure {
  25. PurpleInputFunction function;
  26. guint result;
  27. gpointer data;
  28. } PurpleGLibIOClosure;
  29.  
  30. typedef struct
  31. {
  32. PurpleAccountRequestType type;
  33. PurpleAccount *account;
  34. void *ui_handle;
  35. char *user;
  36. gpointer userdata;
  37. PurpleAccountRequestAuthorizationCb auth_cb;
  38. PurpleAccountRequestAuthorizationCb deny_cb;
  39. guint ref;
  40. } PurpleAccountRequestInfo;
  41.  
  42. static void purple_glib_io_destroy(gpointer data)
  43. {
  44. g_free(data);
  45. }
  46.  
  47. static gboolean purple_glib_io_invoke(GIOChannel *source, GIOCondition condition, gpointer data)
  48. {
  49. PurpleGLibIOClosure *closure = (PurpleGLibIOClosure*)data;
  50. PurpleInputCondition purple_cond = (PurpleInputCondition)0;
  51.  
  52. if (condition & PURPLE_GLIB_READ_COND)
  53. purple_cond |= PURPLE_INPUT_READ;
  54. if (condition & PURPLE_GLIB_WRITE_COND)
  55. purple_cond |= PURPLE_INPUT_WRITE;
  56.  
  57. closure->function(closure->data, g_io_channel_unix_get_fd(source),
  58. purple_cond);
  59.  
  60. return TRUE;
  61. }
  62.  
  63. static guint glib_input_add(gint fd, PurpleInputCondition condition, PurpleInputFunction function,
  64. gpointer data)
  65. {
  66. PurpleGLibIOClosure *closure = g_new0(PurpleGLibIOClosure, 1);
  67. GIOChannel *channel;
  68. GIOCondition cond = 0;
  69.  
  70. closure->function = function;
  71. closure->data = data;
  72.  
  73. if (condition & PURPLE_INPUT_READ)
  74. cond |= PURPLE_GLIB_READ_COND;
  75. if (condition & PURPLE_INPUT_WRITE)
  76. cond |= PURPLE_GLIB_WRITE_COND;
  77.  
  78. channel = g_io_channel_unix_new(fd);
  79. closure->result = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond,
  80. purple_glib_io_invoke, closure, purple_glib_io_destroy);
  81.  
  82. g_io_channel_unref(channel);
  83. return closure->result;
  84. }
  85.  
  86. static PurpleEventLoopUiOps glib_eventloops =
  87. {
  88. g_timeout_add,
  89. g_source_remove,
  90. glib_input_add,
  91. g_source_remove,
  92. NULL,
  93. #if GLIB_CHECK_VERSION(2,14,0)
  94. g_timeout_add_seconds,
  95. #else
  96. NULL,
  97. #endif
  98.  
  99. /* padding */
  100. NULL,
  101. NULL,
  102. NULL
  103. };
  104. /*** End of the eventloop functions. ***/
  105.  
  106. static void network_disconnected(void)
  107. {
  108.  
  109. printf("This machine has been disconnected from the internet\n");
  110.  
  111. }
  112.  
  113. static void report_disconnect_reason(PurpleConnection *gc, PurpleConnectionError reason, const char *text)
  114. {
  115.  
  116. PurpleAccount *account = purple_connection_get_account(gc);
  117. printf("Connection disconnected: \"%s\" (%s)\n >Error: %d\n >Reason: %s\n", purple_account_get_username(account),
  118. purple_account_get_protocol_id(account), reason, text);
  119.  
  120. }
  121.  
  122. static PurpleConnectionUiOps connection_uiops =
  123. {
  124. NULL, /* connect_progress */
  125. NULL, /* connected */
  126. NULL, /* disconnected */
  127. NULL, /* notice */
  128. NULL, /* report_disconnect */
  129. NULL, /* network_connected */
  130. network_disconnected, /* network_disconnected */
  131. report_disconnect_reason, /* report_disconnect_reason */
  132. NULL,
  133. NULL,
  134. NULL
  135. };
  136.  
  137. static void ui_init(void)
  138. {
  139. /**
  140. * This should initialize the UI components for all the modules.
  141. */
  142.  
  143. purple_connections_set_ui_ops(&connection_uiops);
  144.  
  145. }
  146.  
  147. static PurpleCoreUiOps core_uiops =
  148. {
  149. NULL,
  150. NULL,
  151. ui_init,
  152. NULL,
  153.  
  154. /* padding */
  155. NULL,
  156. NULL,
  157. NULL,
  158. NULL
  159. };
  160.  
  161. static void init_libpurple(void)
  162. {
  163. /* Set a custom user directory (optional) */
  164. //purple_util_set_user_dir(CUSTOM_USER_DIRECTORY);
  165.  
  166. /* We do not want any debugging for now to keep the noise to a minimum. */
  167. purple_debug_set_enabled(FALSE);
  168.  
  169. /* Set the core-uiops, which is used to
  170. * - initialize the ui specific preferences.
  171. * - initialize the debug ui.
  172. * - initialize the ui components for all the modules.
  173. * - uninitialize the ui components for all the modules when the core terminates.
  174. */
  175. purple_core_set_ui_ops(&core_uiops);
  176.  
  177. /* Set the uiops for the eventloop. If your client is glib-based, you can safely
  178. * copy this verbatim. */
  179. purple_eventloop_set_ui_ops(&glib_eventloops);
  180.  
  181. /* Set path to search for plugins. The core (libpurple) takes care of loading the
  182. * core-plugins, which includes the protocol-plugins. So it is not essential to add
  183. * any path here, but it might be desired, especially for ui-specific plugins. */
  184. purple_plugins_add_search_path(CUSTOM_PLUGIN_PATH);
  185.  
  186. /* Now that all the essential stuff has been set, let's try to init the core. It's
  187. * necessary to provide a non-NULL name for the current ui to the core. This name
  188. * is used by stuff that depends on this ui, for example the ui-specific plugins. */
  189. if (!purple_core_init(UI_ID)) {
  190. /* Initializing the core failed. Terminate. */
  191. fprintf(stderr,
  192. "libpurple initialization failed. Dumping core.\n"
  193. "Please report this!\n");
  194. abort();
  195. }
  196.  
  197. /* Create and load the buddylist. */
  198. purple_set_blist(purple_blist_new());
  199. purple_blist_load();
  200.  
  201. /* Load the preferences. */
  202. purple_prefs_load();
  203.  
  204. /* Load the desired plugins. The client should save the list of loaded plugins in
  205. * the preferences using purple_plugins_save_loaded(PLUGIN_SAVE_PREF) */
  206. purple_plugins_load_saved(PLUGIN_SAVE_PREF);
  207.  
  208. /* Load the pounces. */
  209. purple_pounces_load();
  210. }
  211.  
  212. /**************************************************************************
  213. * Account subsystem signal callbacks
  214. **************************************************************************/
  215. static void
  216. account_connecting_cb(PurpleAccount *account, void *data)
  217. {
  218. printf("account-connecting (%s)\n",
  219. purple_account_get_username(account));
  220. }
  221.  
  222. static void
  223. account_setting_info_cb(PurpleAccount *account, const char *info, void *data)
  224. {
  225. printf("account-setting-info (%s, %s)\n",
  226. purple_account_get_username(account), info);
  227. }
  228.  
  229. static void
  230. account_set_info_cb(PurpleAccount *account, const char *info, void *data)
  231. {
  232. printf("account-set-info (%s, %s)\n",
  233. purple_account_get_username(account), info);
  234. }
  235.  
  236. static void
  237. account_status_changed(PurpleAccount *account, PurpleStatus *old, PurpleStatus *new, gpointer data)
  238. {
  239. printf("account-status-changed (%s, %s, %s)\n",
  240. purple_account_get_username(account),
  241. purple_status_get_name(old),
  242. purple_status_get_name(new));
  243. }
  244.  
  245. static void
  246. account_alias_changed(PurpleAccount *account, const char *old, gpointer data)
  247. {
  248. printf("account-alias-changed (%s, %s, %s)\n",
  249. purple_account_get_username(account),
  250. old, purple_account_get_alias(account));
  251. }
  252.  
  253. static int
  254. account_authorization_requested_cb(PurpleAccount *account, const char *user, gpointer data)
  255. {
  256. printf("account-authorization-requested (%s, %s)\n",
  257. purple_account_get_username(account), user);
  258. return 0;
  259. }
  260.  
  261. static void
  262. account_authorization_granted_cb(PurpleAccount *account, const char *user, gpointer data)
  263. {
  264. printf("account-authorization-granted (%s, %s)\n",
  265. purple_account_get_username(account), user);
  266. }
  267.  
  268. static void
  269. account_authorization_denied_cb(PurpleAccount *account, const char *user, gpointer data)
  270. {
  271. printf("account-authorization-denied (%s, %s)\n",
  272. purple_account_get_username(account), user);
  273. }
  274.  
  275. /**************************************************************************
  276. * Buddy Icons signal callbacks
  277. **************************************************************************/
  278. static void
  279. buddy_icon_changed_cb(PurpleBuddy *buddy)
  280. {
  281. // printf("buddy icon changed (%s)\n",
  282. // purple_buddy_icon_get_full_path(purple_buddy_get_icon(buddy)));
  283. emit_avatar(purple_buddy_get_name(buddy),purple_account_get_username(purple_buddy_get_account(buddy)), purple_buddy_icon_get_full_path(purple_buddy_get_icon(buddy)));
  284.  
  285. }
  286.  
  287. /**************************************************************************
  288. * Buddy List subsystem signal callbacks
  289. **************************************************************************/
  290. //static void
  291. //buddy_status_changed_cb(PurpleBuddy *buddy, PurpleStatus *old_status,
  292. // PurpleStatus *status, void *data)
  293. //{
  294. // printf("buddy-status-changed (%s %s to %s)\n",
  295. // purple_buddy_get_name(buddy),
  296. // purple_status_get_id(old_status),
  297. // purple_status_get_id(status));
  298. //}
  299.  
  300. static void
  301. buddy_idle_changed_cb(PurpleBuddy *buddy, gboolean old_idle, gboolean idle,
  302. void *data)
  303. {
  304. printf("buddy-idle-changed (%s %s)\n",
  305. purple_buddy_get_name(buddy),
  306. old_idle ? "unidled" : "idled");
  307. }
  308.  
  309. static void
  310. buddy_status_changed_cb(PurpleBuddy *buddy, void *data)
  311. {
  312. // printf("buddy-status-changed (%d)\n",
  313. // strcmp(purple_status_get_id(purple_presence_get_active_status(purple_buddy_get_presence(buddy))),"available") == 0 ? 1 : 0);
  314. emit_status_changed(purple_buddy_get_name(buddy),purple_account_get_username(purple_buddy_get_account(buddy)),strcmp(purple_status_get_id(purple_presence_get_active_status(purple_buddy_get_presence(buddy))),"available") == 0 ? 1 : 0);
  315.  
  316. }
  317.  
  318. //static void
  319. //buddy_signed_on_cb(PurpleBuddy *buddy, void *data)
  320. //{
  321. // printf("buddy-signed-on (%s)\n",
  322. // purple_status_get_name(purple_presence_get_active_status(purple_buddy_get_presence(buddy))));
  323. //}
  324.  
  325. //static void
  326. //buddy_signed_off_cb(PurpleBuddy *buddy, void *data)
  327. //{
  328. // printf("buddy-signed-off (%s)\n",
  329. // purple_status_get_name(purple_presence_get_active_status(purple_buddy_get_presence(buddy))));
  330. //}
  331.  
  332. static void
  333. blist_node_added_cb(PurpleBlistNode *bnode, void *data)
  334. {
  335. const char *name;
  336. if (PURPLE_BLIST_NODE_IS_GROUP(bnode))
  337. name = purple_group_get_name(PURPLE_GROUP(bnode));
  338. else if (PURPLE_BLIST_NODE_IS_CONTACT(bnode))
  339. /* Close enough */
  340. name = purple_contact_get_alias(PURPLE_CONTACT(bnode));
  341. else if (PURPLE_BLIST_NODE_IS_BUDDY(bnode))
  342. name = purple_buddy_get_name(PURPLE_BUDDY(bnode));
  343. else
  344. name = "(unknown)";
  345.  
  346. printf("blist_node_added_cb (%s)\n",
  347. name ? name : "(null)");
  348.  
  349. }
  350.  
  351. static void
  352. blist_node_removed_cb(PurpleBlistNode *bnode, void *data)
  353. {
  354. const char *name;
  355. if (PURPLE_BLIST_NODE_IS_GROUP(bnode))
  356. name = purple_group_get_name(PURPLE_GROUP(bnode));
  357. else if (PURPLE_BLIST_NODE_IS_CONTACT(bnode))
  358. /* Close enough */
  359. name = purple_contact_get_alias(PURPLE_CONTACT(bnode));
  360. else if (PURPLE_BLIST_NODE_IS_BUDDY(bnode))
  361. name = purple_buddy_get_name(PURPLE_BUDDY(bnode));
  362. else
  363. name = "(unknown)";
  364.  
  365. printf("blist_node_removed_cb (%s)\n",
  366. name ? name : "(null)");
  367. }
  368.  
  369. void display(gpointer key, gpointer value, gpointer userdata)
  370. {
  371. printf("display %d", value);
  372. }
  373.  
  374. static void
  375. blist_node_aliased(PurpleBlistNode *node, const char *old_alias)
  376. {
  377. PurpleContact *p = (PurpleContact *)node;
  378. PurpleBuddy *b = (PurpleBuddy *)node;
  379. PurpleChat *c = (PurpleChat *)node;
  380. PurpleGroup *g = (PurpleGroup *)node;
  381.  
  382. if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
  383. printf("blist-node-aliased (Contact: %s, %s)\n",
  384. purple_contact_get_alias(p), old_alias);
  385. } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
  386. // printf("blist-node-aliased (Buddy: %s, %s, %d)\n",
  387. // purple_buddy_get_name(b), (const char*) purple_buddy_get_account(b), g_hash_table_size(purple_buddy_get_account(b)->settings));
  388. emit_add(purple_buddy_get_alias(b),purple_buddy_get_name(b),purple_account_get_username(purple_buddy_get_account(b)), 0);
  389. } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
  390. printf("blist-node-aliased (Chat: %s, %s)\n",
  391. c->alias, old_alias);
  392. } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
  393. printf("blist-node-aliased (Group: %s, %s)\n",
  394. purple_group_get_name(g), old_alias);
  395. } else {
  396. printf("blist-node-aliased (UNKNOWN: %d, %s)\n",
  397. purple_blist_node_get_type(node), old_alias);
  398. }
  399. }
  400.  
  401. static void
  402. blist_node_extended_menu_cb(PurpleBlistNode *node, void *data)
  403. {
  404. PurpleContact *p = (PurpleContact *)node;
  405. PurpleBuddy *b = (PurpleBuddy *)node;
  406. PurpleChat *c = (PurpleChat *)node;
  407. PurpleGroup *g = (PurpleGroup *)node;
  408.  
  409. if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
  410. printf("blist-node-extended-menu (Contact: %s)\n",
  411. purple_contact_get_alias(p));
  412. } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) {
  413. printf("blist-node-extended-menu (Buddy: %s)\n",
  414. purple_buddy_get_name(b));
  415. } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) {
  416. printf("blist-node-extended-menu (Chat: %s)\n",
  417. purple_chat_get_name(c));
  418. } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
  419. printf("blist-node-extended-menu (Group: %s)\n",
  420. purple_group_get_name(g));
  421. } else {
  422. printf("blist-node-extended-menu (UNKNOWN: %d)\n",
  423. purple_blist_node_get_type(node));
  424. }
  425. }
  426.  
  427.  
  428. /**************************************************************************
  429. * Connection subsystem signal callbacks
  430. **************************************************************************/
  431. static void
  432. signing_on_cb(PurpleConnection *gc, void *data)
  433. {
  434. printf("signing-on (%s)\n",
  435. purple_account_get_username(purple_connection_get_account(gc)));
  436. }
  437.  
  438. static void
  439. signed_on_cb(PurpleConnection *gc, void *data)
  440. {
  441. printf("signed-on (%s)\n",
  442. purple_account_get_username(purple_connection_get_account(gc)));
  443. }
  444.  
  445. static void
  446. signing_off_cb(PurpleConnection *gc, void *data)
  447. {
  448. printf("signing-off (%s)\n",
  449. purple_account_get_username(purple_connection_get_account(gc)));
  450. }
  451.  
  452. static void
  453. signed_off_cb(PurpleConnection *gc, void *data)
  454. {
  455. printf("signed-off (%s)\n",
  456. purple_account_get_username(purple_connection_get_account(gc)));
  457. }
  458.  
  459. static void
  460. connection_error_cb(PurpleConnection *gc,
  461. PurpleConnectionError err,
  462. const gchar *desc,
  463. void *data)
  464. {
  465. const gchar *username =
  466. purple_account_get_username(purple_connection_get_account(gc));
  467. printf("connection-error (%s, %u, %s)\n",
  468. username, err, desc);
  469. }
  470.  
  471. /**************************************************************************
  472. * Conversation subsystem signal callbacks
  473. **************************************************************************/
  474. static gboolean
  475. writing_im_msg_cb(PurpleAccount *account, const char *who, char **buffer,
  476. PurpleConversation *conv, PurpleMessageFlags flags, void *data)
  477. {
  478. printf("writing-im-msg (%s, %s, %s)\n",
  479. purple_account_get_username(account), purple_conversation_get_name(conv), *buffer);
  480.  
  481. return FALSE;
  482.  
  483. }
  484.  
  485. static void
  486. wrote_im_msg_cb(PurpleAccount *account, const char *who, const char *buffer,
  487. PurpleConversation *conv, PurpleMessageFlags flags, void *data)
  488. {
  489. // printf("wrote-im-msg (%s, %s, %s, %d, %s, %d)\n",
  490. // purple_account_get_username(account), purple_conversation_get_title(conv), buffer, flags, who, conv->type);
  491. if(flags == PURPLE_MESSAGE_RECV)
  492. reciveMessage(who,purple_account_get_username(account),purple_conversation_get_title(conv), buffer, purple_conversation_message_get_timestamp(purple_conversation_get_message_history(conv)->data),0);
  493. else if(flags == PURPLE_MESSAGE_SEND)
  494. sendMessage(purple_conversation_get_name(conv),purple_account_get_username(account),"Me", buffer, purple_conversation_message_get_timestamp(purple_conversation_get_message_history(conv)->data),0);
  495. // printf("buddy icon changed (%s)\n",
  496. // purple_buddy_icon_get_full_path(purple_buddy_get_icon(purple_find_buddy(purple_conversation_get_account(conv),who))));
  497. }
  498.  
  499. static void
  500. sending_im_msg_cb(PurpleAccount *account, char *recipient, char **buffer, void *data)
  501. {
  502. printf("sending-im-msg (%s, %s, %s)\n",
  503. purple_account_get_username(account), recipient, *buffer);
  504.  
  505. }
  506.  
  507. static void
  508. sent_im_msg_cb(PurpleAccount *account, const char *recipient, const char *buffer, void *data)
  509. {
  510. printf("sent-im-msg (%s, %s, %s)\n",
  511. purple_account_get_username(account), recipient, buffer);
  512. }
  513.  
  514. static gboolean
  515. receiving_im_msg_cb(PurpleAccount *account, char **sender, char **buffer,
  516. PurpleConversation *conv, PurpleMessageFlags *flags, void *data)
  517. {
  518. printf("receiving-im-msg (%s, %s, %s, %s, %d)\n",
  519. purple_account_get_username(account), *sender, *buffer,
  520. (conv != NULL) ? purple_conversation_get_name(conv) : "(null)", *flags);
  521.  
  522. return FALSE;
  523. }
  524.  
  525. static void
  526. received_im_msg_cb(PurpleAccount *account, char *sender, char *buffer,
  527. PurpleConversation *conv, PurpleMessageFlags flags, void *data)
  528. {
  529. printf("received-im-msg (%s, %s, %s, %s, %d)\n",
  530. purple_account_get_username(account), sender, buffer,
  531. (conv != NULL) ? purple_conversation_get_name(conv) : "(null)", flags);
  532. }
  533.  
  534. static gboolean
  535. writing_chat_msg_cb(PurpleAccount *account, const char *who, char **buffer,
  536. PurpleConversation *conv, PurpleMessageFlags flags, void *data)
  537. {
  538. printf("writing-chat-msg (%s, %s)\n",
  539. purple_conversation_get_name(conv), *buffer);
  540.  
  541. return FALSE;
  542. }
  543.  
  544. static void
  545. wrote_chat_msg_cb(PurpleAccount *account, const char *who, const char *buffer,
  546. PurpleConversation *conv, PurpleMessageFlags flags, void *data)
  547. {
  548. printf("wrote-chat-msg (%s, %s, %d)\n",
  549. purple_conversation_get_title(conv), buffer, flags);
  550. if(flags == PURPLE_MESSAGE_RECV)
  551. reciveMessage((const char*[]){purple_conversation_get_name(conv), who},purple_account_get_username(account), purple_buddy_get_alias(purple_find_buddy(purple_conversation_get_account(conv),who)), buffer, purple_conversation_message_get_timestamp(purple_conversation_get_message_history(conv)->data),0);
  552. else if(flags == PURPLE_MESSAGE_SEND)
  553. sendMessage((const char*[]){purple_conversation_get_name(conv)},purple_account_get_username(account),"Me", buffer, purple_conversation_message_get_timestamp(purple_conversation_get_message_history(conv)->data),0);
  554. }
  555.  
  556. static gboolean
  557. sending_chat_msg_cb(PurpleAccount *account, char **buffer, int id, void *data)
  558. {
  559. printf("sending-chat-msg (%s, %s, %d)\n",
  560. purple_account_get_username(account), *buffer, id);
  561.  
  562. return FALSE;
  563. }
  564.  
  565. static void
  566. sent_chat_msg_cb(PurpleAccount *account, const char *buffer, int id, void *data)
  567. {
  568. printf("sent-chat-msg (%s, %s, %d)\n",
  569. purple_account_get_username(account), buffer, id);
  570. }
  571.  
  572. static gboolean
  573. receiving_chat_msg_cb(PurpleAccount *account, char **sender, char **buffer,
  574. PurpleConversation *chat, PurpleMessageFlags *flags, void *data)
  575. {
  576. printf(
  577. "receiving-chat-msg (%s, %s, %s, %s, %d)\n",
  578. purple_account_get_username(account), *sender, *buffer,
  579. purple_conversation_get_title(chat), *flags);
  580.  
  581. return FALSE;
  582. }
  583.  
  584. static void
  585. received_chat_msg_cb(PurpleAccount *account, char *sender, char *buffer,
  586. PurpleConversation *chat, PurpleMessageFlags flags, void *data)
  587. {
  588. printf(
  589. "received-chat-msg (%s, %s, %s, %s, %d)\n",
  590. purple_account_get_username(account), sender, buffer,
  591. purple_conversation_get_name(chat), flags);
  592. }
  593.  
  594. static void
  595. conversation_created_cb(PurpleConversation *conv, void *data)
  596. {
  597. printf("conversation-created (%s)\n",
  598. purple_conversation_get_name(conv));
  599. }
  600.  
  601. static void
  602. deleting_conversation_cb(PurpleConversation *conv, void *data)
  603. {
  604. printf("deleting-conversation (%s)\n",
  605. purple_conversation_get_name(conv));
  606. }
  607.  
  608. static void
  609. buddy_typing_cb(PurpleAccount *account, const char *name, void *data)
  610. {
  611. printf("buddy-typing (%s, %s)\n",
  612. purple_account_get_username(account), name);
  613. }
  614.  
  615. static void
  616. buddy_typing_stopped_cb(PurpleAccount *account, const char *name, void *data)
  617. {
  618. printf("buddy-typing-stopped (%s, %s)\n",
  619. purple_account_get_username(account), name);
  620. }
  621.  
  622. static gboolean
  623. chat_buddy_joining_cb(PurpleConversation *conv, const char *user,
  624. PurpleConvChatBuddyFlags flags, void *data)
  625. {
  626. printf("chat-buddy-joining (%s, %s, %d)\n",
  627. purple_conversation_get_name(conv), user, flags);
  628.  
  629. return FALSE;
  630. }
  631.  
  632. static void
  633. chat_buddy_joined_cb(PurpleConversation *conv, const char *user,
  634. PurpleConvChatBuddyFlags flags, gboolean new_arrival, void *data)
  635. {
  636. printf("chat-buddy-joined (%s, %s, %d, %d)\n",
  637. purple_conversation_get_name(conv), user, flags, new_arrival);
  638. }
  639.  
  640. static void
  641. chat_buddy_flags_cb(PurpleConversation *conv, const char *user,
  642. PurpleConvChatBuddyFlags oldflags, PurpleConvChatBuddyFlags newflags, void *data)
  643. {
  644. printf("chat-buddy-flags (%s, %s, %d, %d)\n",
  645. purple_conversation_get_name(conv), user, oldflags, newflags);
  646. }
  647.  
  648. static gboolean
  649. chat_buddy_leaving_cb(PurpleConversation *conv, const char *user,
  650. const char *reason, void *data)
  651. {
  652. printf("chat-buddy-leaving (%s, %s, %s)\n",
  653. purple_conversation_get_name(conv), user, reason);
  654.  
  655. return FALSE;
  656. }
  657.  
  658. static void
  659. chat_buddy_left_cb(PurpleConversation *conv, const char *user,
  660. const char *reason, void *data)
  661. {
  662. printf("chat-buddy-left (%s, %s, %s)\n",
  663. purple_conversation_get_name(conv), user, reason);
  664. }
  665.  
  666. static void
  667. chat_inviting_user_cb(PurpleConversation *conv, const char *name,
  668. char **reason, void *data)
  669. {
  670. printf("chat-inviting-user (%s, %s, %s)\n",
  671. purple_conversation_get_name(conv), name, *reason);
  672. }
  673.  
  674. static void
  675. chat_invited_user_cb(PurpleConversation *conv, const char *name,
  676. const char *reason, void *data)
  677. {
  678. printf("chat-invited-user (%s, %s, %s)\n",
  679. purple_conversation_get_name(conv), name, reason);
  680. }
  681.  
  682. static gint
  683. chat_invited_cb(PurpleAccount *account, const char *inviter,
  684. const char *room_name, const char *message,
  685. const GHashTable *components, void *data)
  686. {
  687. printf("chat-invited (%s, %s, %s, %s)\n",
  688. purple_account_get_username(account), inviter,
  689. room_name, message);
  690.  
  691. return 0;
  692. }
  693.  
  694. static void
  695. chat_joined_cb(PurpleConversation *conv, void *data)
  696. {
  697. printf("chat-joined (%s)\n",
  698. purple_conversation_get_title(conv));
  699. }
  700.  
  701. static void
  702. chat_left_cb(PurpleConversation *conv, void *data)
  703. {
  704. printf("chat-left (%s)\n",
  705. purple_conversation_get_name(conv));
  706. }
  707.  
  708. static void
  709. chat_topic_changed_cb(PurpleConversation *conv, const char *who,
  710. const char *topic, void *data)
  711. {
  712. printf(
  713. "chat-topic-changed (%s topic changed to: \"%s\" by %s)\n",
  714. purple_conversation_get_name(conv), topic,
  715. (who) ? who : "unknown");
  716. purple_conversation_set_title(conv, topic);
  717. emit_add(purple_conversation_get_title(conv),purple_conversation_get_name(conv), purple_account_get_username(purple_conversation_get_account(conv)), 1);
  718. }
  719.  
  720. static void connect_to_signals(void)
  721. {
  722.  
  723. void *core_handle = purple_get_core();
  724. void *blist_handle = purple_blist_get_handle();
  725. void *conn_handle = purple_connections_get_handle();
  726. void *conv_handle = purple_conversations_get_handle();
  727. void *accounts_handle = purple_accounts_get_handle();
  728. static int handle;
  729.  
  730.  
  731. purple_signal_connect(accounts_handle, "account-connecting",
  732. &handle, PURPLE_CALLBACK(account_connecting_cb), NULL);
  733. purple_signal_connect(accounts_handle, "account-setting-info",
  734. &handle, PURPLE_CALLBACK(account_setting_info_cb), NULL);
  735. purple_signal_connect(accounts_handle, "account-set-info",
  736. &handle, PURPLE_CALLBACK(account_set_info_cb), NULL);
  737. purple_signal_connect(accounts_handle, "account-status-changed",
  738. &handle, PURPLE_CALLBACK(account_status_changed), NULL);
  739. purple_signal_connect(accounts_handle, "account-alias-changed",
  740. &handle, PURPLE_CALLBACK(account_alias_changed), NULL);
  741. purple_signal_connect(accounts_handle, "account-authorization-requested",
  742. &handle, PURPLE_CALLBACK(account_authorization_requested_cb), NULL);
  743. purple_signal_connect(accounts_handle, "account-authorization-denied",
  744. &handle, PURPLE_CALLBACK(account_authorization_denied_cb), NULL);
  745. purple_signal_connect(accounts_handle, "account-authorization-granted",
  746. &handle, PURPLE_CALLBACK(account_authorization_granted_cb), NULL);
  747.  
  748. /* Buddy List subsystem signals */
  749. // purple_signal_connect(blist_handle, "buddy-status-changed",
  750. // &handle, PURPLE_CALLBACK(buddy_status_changed_cb), NULL);
  751. // purple_signal_connect(blist_handle, "buddy-idle-changed",
  752. // &handle, PURPLE_CALLBACK(buddy_idle_changed_cb), NULL);
  753. purple_signal_connect(blist_handle, "buddy-signed-on",
  754. &handle, PURPLE_CALLBACK(buddy_status_changed_cb), NULL);
  755. purple_signal_connect(blist_handle, "buddy-signed-off",
  756. &handle, PURPLE_CALLBACK(buddy_status_changed_cb), NULL);
  757. // purple_signal_connect(blist_handle, "blist-node-added",
  758. // &handle, PURPLE_CALLBACK(blist_node_added_cb), NULL);
  759. // purple_signal_connect(blist_handle, "blist-node-removed",
  760. // &handle, PURPLE_CALLBACK(blist_node_removed_cb), NULL);
  761. purple_signal_connect(blist_handle, "buddy-icon-changed",
  762. &handle, PURPLE_CALLBACK(buddy_icon_changed_cb), NULL);
  763. purple_signal_connect(blist_handle, "blist-node-aliased",
  764. &handle, PURPLE_CALLBACK(blist_node_aliased), NULL);
  765. // purple_signal_connect(blist_handle, "blist-node-extended-menu",
  766. // &handle, PURPLE_CALLBACK(blist_node_extended_menu_cb), NULL);
  767.  
  768. /* Connection subsystem signals */
  769. purple_signal_connect(conn_handle, "signing-on",
  770. &handle, PURPLE_CALLBACK(signing_on_cb), NULL);
  771. purple_signal_connect(conn_handle, "signed-on",
  772. &handle, PURPLE_CALLBACK(signed_on_cb), NULL);
  773. purple_signal_connect(conn_handle, "signing-off",
  774. &handle, PURPLE_CALLBACK(signing_off_cb), NULL);
  775. purple_signal_connect(conn_handle, "signed-off",
  776. &handle, PURPLE_CALLBACK(signed_off_cb), NULL);
  777. purple_signal_connect(conn_handle, "connection-error",
  778. &handle, PURPLE_CALLBACK(connection_error_cb), NULL);
  779.  
  780. /* Conversations subsystem signals */
  781. purple_signal_connect(conv_handle, "writing-im-msg",
  782. &handle, PURPLE_CALLBACK(writing_im_msg_cb), NULL);
  783. purple_signal_connect(conv_handle, "wrote-im-msg",
  784. &handle, PURPLE_CALLBACK(wrote_im_msg_cb), NULL);
  785. purple_signal_connect(conv_handle, "sending-im-msg",
  786. &handle, PURPLE_CALLBACK(sending_im_msg_cb), NULL);
  787. purple_signal_connect(conv_handle, "sent-im-msg",
  788. &handle, PURPLE_CALLBACK(sent_im_msg_cb), NULL);
  789. purple_signal_connect(conv_handle, "receiving-im-msg",
  790. &handle, PURPLE_CALLBACK(receiving_im_msg_cb), NULL);
  791. purple_signal_connect(conv_handle, "received-im-msg",
  792. &handle, PURPLE_CALLBACK(received_im_msg_cb), NULL);
  793. purple_signal_connect(conv_handle, "writing-chat-msg",
  794. &handle, PURPLE_CALLBACK(writing_chat_msg_cb), NULL);
  795. purple_signal_connect(conv_handle, "wrote-chat-msg",
  796. &handle, PURPLE_CALLBACK(wrote_chat_msg_cb), NULL);
  797. purple_signal_connect(conv_handle, "sending-chat-msg",
  798. &handle, PURPLE_CALLBACK(sending_chat_msg_cb), NULL);
  799. purple_signal_connect(conv_handle, "sent-chat-msg",
  800. &handle, PURPLE_CALLBACK(sent_chat_msg_cb), NULL);
  801. purple_signal_connect(conv_handle, "receiving-chat-msg",
  802. &handle, PURPLE_CALLBACK(receiving_chat_msg_cb), NULL);
  803. purple_signal_connect(conv_handle, "received-chat-msg",
  804. &handle, PURPLE_CALLBACK(received_chat_msg_cb), NULL);
  805. purple_signal_connect(conv_handle, "conversation-created",
  806. &handle, PURPLE_CALLBACK(conversation_created_cb), NULL);
  807. purple_signal_connect(conv_handle, "deleting-conversation",
  808. &handle, PURPLE_CALLBACK(deleting_conversation_cb), NULL);
  809. // purple_signal_connect(conv_handle, "buddy-typing",
  810. // &handle, PURPLE_CALLBACK(buddy_typing_cb), NULL);
  811. // purple_signal_connect(conv_handle, "buddy-typing-stopped",
  812. // &handle, PURPLE_CALLBACK(buddy_typing_stopped_cb), NULL);
  813. purple_signal_connect(conv_handle, "chat-buddy-joining",
  814. &handle, PURPLE_CALLBACK(chat_buddy_joining_cb), NULL);
  815. purple_signal_connect(conv_handle, "chat-buddy-joined",
  816. &handle, PURPLE_CALLBACK(chat_buddy_joined_cb), NULL);
  817. purple_signal_connect(conv_handle, "chat-buddy-flags",
  818. &handle, PURPLE_CALLBACK(chat_buddy_flags_cb), NULL);
  819. purple_signal_connect(conv_handle, "chat-buddy-leaving",
  820. &handle, PURPLE_CALLBACK(chat_buddy_leaving_cb), NULL);
  821. purple_signal_connect(conv_handle, "chat-buddy-left",
  822. &handle, PURPLE_CALLBACK(chat_buddy_left_cb), NULL);
  823. purple_signal_connect(conv_handle, "chat-inviting-user",
  824. &handle, PURPLE_CALLBACK(chat_inviting_user_cb), NULL);
  825. purple_signal_connect(conv_handle, "chat-invited-user",
  826. &handle, PURPLE_CALLBACK(chat_invited_user_cb), NULL);
  827. purple_signal_connect(conv_handle, "chat-invited",
  828. &handle, PURPLE_CALLBACK(chat_invited_cb), NULL);
  829. purple_signal_connect(conv_handle, "chat-joined",
  830. &handle, PURPLE_CALLBACK(chat_joined_cb), NULL);
  831. purple_signal_connect(conv_handle, "chat-left",
  832. &handle, PURPLE_CALLBACK(chat_left_cb), NULL);
  833. purple_signal_connect(conv_handle, "chat-topic-changed",
  834. &handle, PURPLE_CALLBACK(chat_topic_changed_cb), NULL);
  835.  
  836. }
  837.  
  838. void writeMessage(const char* message, const char* fbid, const char* fba, int isChat) {
  839. if(!isChat) {
  840. // printf("im %d\n", isChat);
  841. PurpleConversation* conversation = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, fbid, purple_accounts_find(fba, "prpl-facebook"));
  842. if(conversation != NULL)
  843. purple_conv_im_send(PURPLE_CONV_IM(conversation), message);
  844. else {
  845. conversation = purple_conversation_new(PURPLE_CONV_TYPE_IM, purple_accounts_find(fba, "prpl-facebook"), fbid);
  846. purple_conv_im_send(PURPLE_CONV_IM(conversation), message);
  847. }
  848. } else {
  849. // printf("chat %d\n", isChat);
  850. PurpleConversation* conversation = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, fbid, purple_accounts_find(fba, "prpl-facebook"));
  851. if(conversation != NULL)
  852. purple_conv_chat_send(PURPLE_CONV_CHAT(conversation), message);
  853. else {
  854. conversation = purple_conversation_new(PURPLE_CONV_TYPE_CHAT, purple_accounts_find(fba, "prpl-facebook"), fbid);
  855. purple_conv_chat_send(PURPLE_CONV_CHAT(conversation), message);
  856. }
  857. }
  858. }
  859.  
  860. void loadHistory(const char *fbid, const char *fba, int isChat) {
  861. if(!isChat) {
  862. PurpleConversation* conversation = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, fbid, purple_accounts_find(fba, "prpl-facebook"));//purple_blist_find_chat(purple_accounts_find(fba, "prpl-facebook"), fbid);
  863. if(conversation != NULL) {
  864. GList *l = g_list_last(purple_conversation_get_message_history(conversation));
  865. for (l; l != NULL; l = l->prev) {
  866. if(purple_conversation_message_get_flags(l->data) == PURPLE_MESSAGE_RECV)
  867. reciveMessage(purple_conversation_get_name(conversation), purple_account_get_username(purple_conversation_get_account(conversation)), purple_buddy_get_alias(purple_find_buddy(purple_conversation_get_account(conversation),purple_conversation_message_get_sender(l->data))), purple_conversation_message_get_message(l->data), purple_conversation_message_get_timestamp(l->data),1);
  868. else if(purple_conversation_message_get_flags(l->data) == PURPLE_MESSAGE_SEND)
  869. sendMessage(purple_conversation_get_name(conversation), purple_account_get_username(purple_conversation_get_account(conversation)), "Me", purple_conversation_message_get_message(l->data), purple_conversation_message_get_timestamp(l->data),1);
  870. }
  871. }
  872. } else {
  873. PurpleConversation* conversation = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, fbid, purple_accounts_find(fba, "prpl-facebook"));//purple_blist_find_chat(purple_accounts_find(fba, "prpl-facebook"), fbid);
  874. if(conversation != NULL) {
  875. GList *l = g_list_last(purple_conversation_get_message_history(conversation));
  876. for (l; l != NULL; l = l->prev) {
  877. if(purple_conversation_message_get_flags(l->data) == PURPLE_MESSAGE_RECV)
  878. reciveMessage(purple_conversation_get_name(conversation), purple_account_get_username(purple_conversation_get_account(conversation)), purple_buddy_get_alias(purple_find_buddy(purple_conversation_get_account(conversation),purple_conversation_message_get_sender(l->data))), purple_conversation_message_get_message(l->data), purple_conversation_message_get_timestamp(l->data), 1);
  879. else if(purple_conversation_message_get_flags(l->data) == PURPLE_MESSAGE_SEND)
  880. sendMessage(purple_conversation_get_name(conversation), purple_account_get_username(purple_conversation_get_account(conversation)), "Me", purple_conversation_message_get_message(l->data), purple_conversation_message_get_timestamp(l->data), 1);
  881. }
  882. }
  883. }
  884. }
  885.  
  886. void login(const char* login, const char* password) {
  887. PurpleAccount *account = purple_account_new(login, "prpl-facebook"); //this could be prpl-aim, prpl-yahoo, prpl-msn, prpl-icq, etc.
  888. purple_account_set_password(account, password);
  889. purple_account_set_remember_password(account, TRUE);
  890. purple_accounts_add(account);
  891. purple_account_set_enabled(account, UI_ID, TRUE);
  892. }
  893.  
  894. void enableAllAccounts() {
  895. GList *l = purple_accounts_get_all();
  896. for (l; l != NULL; l = l->next) {
  897. purple_account_set_enabled(l->data, UI_ID, TRUE);
  898. }
  899. }
  900.  
  901. void* start( void* arg ) {
  902. signal(SIGCHLD, SIG_IGN);
  903.  
  904. GMainLoop *loop = g_main_loop_new(NULL, FALSE);
  905.  
  906. init_libpurple();
  907.  
  908. printf("libpurple initialized. Running version %s.\n", purple_core_get_version()); //I like to see the version number
  909.  
  910. connect_to_signals();
  911.  
  912. enableAllAccounts();
  913.  
  914. g_main_loop_run(loop);
  915. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement