/mastodoncustomemojis/mastodoncustomemojis.php

https://github.com/friendica/friendica-addons · PHP · 98 lines · 67 code · 22 blank · 9 comment · 9 complexity · 2d9f562122bad34061f41334df443913 MD5 · raw file

  1. <?php
  2. /*
  3. * Name: Mastodon Custom Emojis
  4. * Description: Replace emojis shortcodes in Mastodon posts with their originating server custom emojis images.
  5. * Version: 1.0
  6. * Author: Hypolite Petovan
  7. * Author: Roland Haeder
  8. * Status: Unsupported
  9. */
  10. use Friendica\App;
  11. use Friendica\Content\Smilies;
  12. use Friendica\Core\Cache\Enum\Duration;
  13. use Friendica\Core\Hook;
  14. use Friendica\Core\Protocol;
  15. use Friendica\DI;
  16. use Friendica\Util\Proxy as ProxyUtils;
  17. function mastodoncustomemojis_install()
  18. {
  19. Hook::register('put_item_in_cache', __FILE__, 'mastodoncustomemojis_put_item_in_cache');
  20. Hook::register('network_mod_init', __FILE__, 'mastodoncustomemojis_css_hook');
  21. Hook::register('display_mod_init', __FILE__, 'mastodoncustomemojis_css_hook');
  22. Hook::register('search_mod_init', __FILE__, 'mastodoncustomemojis_css_hook');
  23. Hook::register('community_mod_init', __FILE__, 'mastodoncustomemojis_css_hook');
  24. Hook::register('contacts_mod_init', __FILE__, 'mastodoncustomemojis_css_hook');
  25. }
  26. function mastodoncustomemojis_css_hook(App $a)
  27. {
  28. DI::page()['htmlhead'] .= <<<HTML
  29. <!-- Style added by mastodoncustomemojis -->
  30. <style type="text/css">
  31. .emoji.mastodon {
  32. height: 1.2em;
  33. vertical-align: middle;
  34. }
  35. </style>
  36. HTML;
  37. }
  38. function mastodoncustomemojis_put_item_in_cache(App $a, array &$hook_data)
  39. {
  40. // Mastodon uses OStatus and ActivityPub, skipping other network protocols
  41. if (empty($hook_data['item']['author-link']) || !in_array($hook_data['item']['network'], [Protocol::OSTATUS, Protocol::ACTIVITYPUB])) {
  42. return;
  43. }
  44. $emojis = mastodoncustomemojis_get_custom_emojis_for_author($hook_data['item']['author-link']);
  45. $hook_data["rendered-html"] = Smilies::replaceFromArray($hook_data["rendered-html"], $emojis);
  46. }
  47. function mastodoncustomemojis_get_custom_emojis_for_author($author_link)
  48. {
  49. $url_parts = parse_url($author_link);
  50. $api_base_url = $url_parts['scheme'] . '://' . $url_parts['host'] . (isset($url_parts['port']) ? ':' . $url_parts['port'] : '');
  51. $cache_key = 'mastodoncustomemojis:' . $api_base_url;
  52. $return = DI::cache()->get($cache_key);
  53. if (empty($return) || DI::config()->get('system', 'ignore_cache')) {
  54. $return = mastodoncustomemojis_fetch_custom_emojis_for_url($api_base_url);
  55. DI::cache()->set($cache_key, $return, empty($return['texts']) ? Duration::QUARTER_HOUR : Duration::HOUR);
  56. }
  57. return $return;
  58. }
  59. function mastodoncustomemojis_fetch_custom_emojis_for_url($api_base_url)
  60. {
  61. $return = ['texts' => [], 'icons' => []];
  62. $api_url = $api_base_url . '/api/v1/custom_emojis';
  63. $fetchResult = DI::httpClient()->fetchFull($api_url);
  64. if ($fetchResult->isSuccess()) {
  65. $emojis_array = json_decode($fetchResult->getBody(), true);
  66. if (is_array($emojis_array) && count($emojis_array)) {
  67. foreach ($emojis_array as $emoji) {
  68. if (!empty($emoji['shortcode']) && !empty($emoji['static_url'])) {
  69. $return['texts'][] = ':' . $emoji['shortcode'] . ':';
  70. $return['icons'][] = '<img class="emoji mastodon" src="' . ProxyUtils::proxifyUrl($emoji['static_url']) . '" alt=":' . $emoji['shortcode'] . ':" title=":' . $emoji['shortcode'] . ':"/>';
  71. }
  72. }
  73. }
  74. }
  75. return $return;
  76. }