Change Facebook Notification Sound

Small script for a request https://greasyfork.org/uk/forum/discussion/6631/change-facebook-notification-sound-convert-chrome-extension-to-userscript

  1. // ==UserScript==
  2. // @name Change Facebook Notification Sound
  3. // @namespace cfs
  4. // @author Dexmaster
  5. // @date 2015-11-09
  6. // @description Small script for a request https://greasyfork.org/uk/forum/discussion/6631/change-facebook-notification-sound-convert-chrome-extension-to-userscript
  7. // @include https://facebook.com/*
  8. // @include https://www.facebook.com/*
  9. // @version 0.2.4
  10. // @require https://openuserjs.org/src/libs/sizzle/GM_config.js
  11. // @grant GM_getValue
  12. // @grant GM_setValue
  13. // @grant GM_log
  14. // @grant GM_addStyle
  15. // @grant GM_registerMenuCommand
  16. // @noframes
  17. // ==/UserScript==
  18. (function () {
  19. 'use strict';
  20. var soundUri,
  21. interval,
  22. status,
  23. audio,
  24. windowStatus = false,
  25. intv;
  26. var openClose = function () {
  27. if (!!windowStatus) {
  28. GM_config.close();
  29. } else {
  30. GM_config.open();
  31. }
  32. };
  33. var countUnread = function () {
  34. var els = document.querySelectorAll('._51jx'),
  35. sum = Array.prototype.map.call(els, function (el) {
  36. return parseInt(el.innerHTML) || 0;
  37. }).reduce(function (a, b) {
  38. return a + b;
  39. }, 0);
  40. return sum;
  41. };
  42. var playerStart = function (num) {
  43. var c = new Date(),
  44. cv = new Date(GM_getValue('lastPlay'));
  45. //console.info((c - cv) > intv * 2);
  46. if ((c - cv) > intv * 2) {
  47. //console.info(num);
  48. var cnt = GM_getValue('counter');
  49. GM_setValue('counter', num);
  50. if (cnt < num) {
  51. GM_setValue('lastPlay', c);
  52. audio.play();
  53. }
  54. }
  55. };
  56. var numberChange = function () {
  57. var num = countUnread();
  58. if ((GM_getValue('counter') !== num) && (num > 0)) {
  59. playerStart(num);
  60. }
  61. };
  62. var init = function () {
  63. soundUri = GM_config.get('soundUri');
  64. interval = GM_config.get('interval');
  65. status = GM_config.get('status');
  66. if (!status) {
  67. return;
  68. }
  69. if (!audio) {
  70. audio = document.createElement('audio');
  71. }
  72. if (audio.getAttribute('src') !== soundUri) {
  73. audio.setAttribute('src', soundUri);
  74. }
  75. if (!!intv) {
  76. clearInterval(intv);
  77. }
  78. intv = setInterval(numberChange, interval * 1000);
  79. };
  80. GM_config.init({
  81. 'id': 'CFNS',
  82. 'title': 'Notification Sound Settings',
  83. 'fields': {
  84. 'status': {
  85. 'label': 'Enable',
  86. 'type': 'checkbox',
  87. 'default': true
  88. },
  89. 'soundUri': {
  90. 'label': 'Sound File Url',
  91. 'type': 'text',
  92. 'default': 'https://instaud.io/_/djS.mp3'
  93. },
  94. 'interval': {
  95. 'label': 'Notification check interval (in sec)',
  96. 'type': 'unsigned float',
  97. 'default': 5
  98. },
  99. },
  100. 'events': // Callback functions object
  101. {
  102. 'init': function () {
  103. GM_addStyle('#CFNS {border:medium none!important;border-radius:3px;box-shadow:0 0 5px 0 #888,0 0 5px 0 #06f;height:260px!important;width:380px!important}');
  104. if (!GM_getValue('lastPlay')) {
  105. GM_setValue('lastPlay', new Date());
  106. }
  107. if (!GM_getValue('counter')) {
  108. GM_setValue('counter', 0);
  109. }
  110. init();
  111. GM_registerMenuCommand('Notification Sound Settings', openClose, 'F');
  112. },
  113. 'save': function () {
  114. init();
  115. },
  116. 'close': function () {
  117. windowStatus = false;
  118. },
  119. 'open': function () {
  120. windowStatus = true;
  121. }
  122. },
  123. css: '#CFNS_wrapper{max-width:400px;margin:0 auto;background:#fff;border-radius:2px;padding:0;font-family:Georgia,"Times New Roman",Times,serif}.config_header{display:block;text-align:center;padding:0;margin:0 0 20px;color:#5C5C5C;font-size:x-large}#CFNS_wrapper .config_var{display:block;padding:9px;border:1px solid #DDD;margin-bottom:10px;border-radius:3px}#CFNS_wrapper .config_var:last-child{border:none;margin-bottom:0;text-align:center}#CFNS_wrapper .config_var > label{display:block;float:left;margin-top:-19px;background:#FFF;height:14px;padding:2px 5px;color:#B9B9B9;font-size:14px;overflow:hidden;font-family:Arial,Helvetica,sans-serif}#CFNS_wrapper .config_var input[type="text"],#CFNS_wrapper .config_var input[type="date"],#CFNS_wrapper .config_var input[type="datetime"],#CFNS_wrapper .config_var input[type="email"],#CFNS_wrapper .config_var input[type="number"],#CFNS_wrapper .config_var input[type="search"],#CFNS_wrapper .config_var input[type="time"],#CFNS_wrapper .config_var input[type="url"],#CFNS_wrapper .config_var input[type="password"],#CFNS_wrapper .config_var textarea,#CFNS_wrapper .config_var select{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;width:100%;display:block;outline:none;border:none;height:25px;line-height:25px;font-size:16px;padding:0;font-family:Georgia,"Times New Roman",Times,serif}#CFNS_wrapper textarea{resize:none}#CFNS_wrapper .saveclose_buttons{background:#2471FF;border:none;border-bottom:3px solid #5994FF;border-radius:3px;color:#D2E2FF;font-size:18px;margin:0 0 0 20px;padding:5px 20px;cursor: pointer;}#CFNS_wrapper .saveclose_buttons:hover{background:#6B9FFF;color:#fff}'
  124. });
  125. }());