您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Messenger & Shoutbox improvements
// ==UserScript== // @name BS-Tool // @namespace https://bs.to/ // @version 0.26 // @description Messenger & Shoutbox improvements // @author ShafterOne // @match https://bs.to/* // @grant GM_xmlhttpRequest // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_setValue // @grant GM_getValue // @grant GM_listValues // @grant GM_deleteValue // ==/UserScript== var storage = { prefix: $('#navigation div strong').html() + "_", reset(){ var storage = GM_listValues(); for (var key in storage) { GM_deleteValue(storage[key]); } }, get(key){ return GM_getValue(this.prefix + key); }, set(key, value){ GM_setValue(this.prefix + key, value); }, getList(key){ return GM_getValue(this.prefix + key) || []; }, getListItem(key, index){ return this.getList(key)[index] || []; }, setList(key, value){ var list = this.getList(key); if (list.indexOf(value) == -1) { list.push(value); GM_setValue(this.prefix + key, list); } }, isInList(key, value){ var list = this.getList(key); return list.indexOf(value) !== -1 ? true : false; }, isInObjectList(list, idx){ list = this.getList(list); return list.hasOwnProperty(idx) ? true : false; }, setObjectListItem(list, key, object){ var objectList = this.getObjectList(list); objectList[key] = object; GM_setValue(this.prefix + list, objectList); }, getObjectList(list){ return GM_getValue(this.prefix + list) || {}; }, getObjectListItem(list, key){ return this.getList(list)[key]; }, removeListItem(key, value) { var list = this.getList(key); var idx = list.indexOf(value); list.splice(idx, 1); GM_setValue(this.prefix + key, list); }, }; var sb = { lastID: 1, myUsername: $('#navigation div strong').html(), posts: [], renderedPost: [], mode: 'update', buffer: 500, box: $('#sbPosts'), refreshInterval: 1500, scrollDown: true, alwaysVisible: false, //true to show Shoutbox on all pages headers: { "Content-Type": "application/x-www-form-urlencoded", 'Cookie': document.cookie, 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Referer': 'https://bs.to/home', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36', 'host': 'bs.to', 'Origin': 'https://bs.to' }, emojiPath: '/public/img/emojis/', emojis: [ {img: 'smiling.png', txt: ':)'}, {img: 'grinning.png', txt: ':D'}, {img: 'tongue_out.png', txt: ':P'}, {img: 'frowning.png', txt: ':('}, {img: 'speechless.png', txt: ':|'}, {img: 'surprised.png', txt: ':O'}, {img: 'angry.png', txt: ':!'}, {img: 'lips_sealed.png', txt: ':x'}, {img: 'heart.png', txt: '<3'}, {img: 'kiss.png', txt: ':*'}, {img: 'poop.png', txt: '*poop*'}, {img: 'thumbs_up.png', txt: '(Y)'}, ], init(){ clearTimeout(Shoutbox.timeout1); sb.getPosts(); sb.updateSbMenu(); sb.refreshPosts(); $('#shoutbox form').attr('onsubmit', 'return null'); var textbox = $('#sbMsg'); textbox.attr('onkeydown', null); textbox.keypress(function (event) { var keycode = (event.keyCode ? event.keyCode : event.which); if (keycode == '13') { sb.sendMessage(); } }); $('#sbSubmit').click(function (event) { event.preventDefault(); sb.sendMessage(); }); }, getPosts(){ var self = this; GM_xmlhttpRequest({ method: "POST", data: $.param({last: this.lastID}), url: "https://bs.to/ajax/sb-posts.php", headers: self.headers, onload: function (res) { data = JSON.parse(res.responseText); self.setPosts(data.posts.reverse()); self.lastID = data.last > 0 ? data.last : self.lastID; } }); }, sendMessage(){ var self = this; GM_xmlhttpRequest({ method: "POST", data: $.param({last: this.lastID, text: $('#sbMsg').val()}), url: "https://bs.to/ajax/sb-send.php", headers: self.headers, onload: function (res) { self.getPosts(); $('#sbMsg').val(''); } }); }, setPosts(posts){ var startPos = this.getScrollPos(); for (var idx in posts) { this.posts.push(posts[idx]); if (this.posts.length > this.buffer) { this.posts.shift(); } } if (this.mode == 'update') { if (this.scrollDown || startPos.sp + 50 >= startPos.ms) { this.updatePosts(); var newPos = this.getScrollPos(); this.box.scrollTop(newPos.ms); this.scrollDown = false; } else { this.updatePosts(); this.box.scrollTop(startPos.sp); } } else { this.renderBox(); } }, refreshPosts(){ var self = this; setInterval(function () { self.getPosts(); }, self.refreshInterval); }, updatePosts(){ if (this.lastID == 1) { this.box.html(this.getPostsHtml()); } else { this.box.append(this.getPostsHtml()); } this.attachUserMenuEvents(); }, reRenderPosts(){ this.renderedPost = []; this.box.html(''); this.updatePosts(); }, getScrollPos(){ var sp = this.box.scrollTop(); var sh = this.box.prop("scrollHeight"); var ms = sh - this.box.outerHeight(); return {sp: sp, sh: sh, ms: ms}; }, removeFirstPost(){ if (this.renderedPost.length > this.buffer) { this.renderedPost.shift(); this.box.find('dt')[0].remove(); this.box.find('dd')[0].remove(); } }, getPostsHtml(){ var html = ''; for (var idx in this.posts) { var post = this.posts[idx]; if (!storage.isInList('muted', post.user) && this.renderedPost.indexOf(post.id) == -1) { var text = post.text.replace(/((?:www\.|https?:\/\/)([^\s]+))/, '<a class="truncate" href="$1" target="_blank">$2</a>', "g"); for (var i in this.emojis) { var emo = this.emojis[i]; text = text.split(emo.txt == '<3' ? '<3' : emo.txt).join(' <img src="' + this.emojiPath + emo.img + '" alt="' + emo.txt + '" title="' + emo.txt + '" class="sb_smiley" />'); } var mark = '<i title="Teilnehmer markieren" class="fa fa-bullseye mark user-option" aria-hidden="true"></i>'; var mail = '<i title="PM Senden" class="fa fa-envelope send-mail user-option" aria-hidden="true"></i>'; var pasteName = '<i title="Name in TextBox einfuegen" onclick="Shoutbox.addSmiley(\'@' + post.user + '\')" class="fa fa-clone user-option" aria-hidden="true"></i>'; var mute = !storage.isInList('friends', post.user) ? '<i title="Mute User" class="fa fa-ban mute-user user-option" aria-hidden="true"></i>' : ''; var marked = storage.get('marked') == post.user ? ' marked' : ''; var userOption = post.user != this.myUsername ? '<span class="user-menu" data-user="' + post.user + '">' + pasteName + mark + mail + mute + '<span>' : ''; var hl = storage.isInList('friends', post.user) ? 'class="highlight' + marked + '"' : 'class="' + marked + '"'; hl = post.user == this.myUsername ? 'class="highlight-me"' : hl; html += '<dt ' + hl + '><a class="' + post.rank + '" href="https://bs.to/user/' + post.user + '">' + post.user + '</a> <time>' + post.time + '</time>' + userOption + '</dt>'; html += '<dd>' + text + '</dd>'; this.renderedPost.push(post.id); this.removeFirstPost(); } } return html; }, updateSbMenu(){ var header = $('#shoutbox header'); var html = '<ul id="sb-menu">'; var muted = storage.getList('muted'); if (header.find('#sb-menu').length) { header.find('#sb-menu').remove(); } html += this.renderMutedUsers(); html += '</ul>'; header.prepend(html); this.attachSbMenuEvents(); }, attachSbMenuEvents(){ $("#sb-menu>li").hover( function () { $(this).find('.sub-menu').removeClass("hidden"); }, function () { $(this).find('.sub-menu').addClass("hidden"); } ); $('#sb-menu .reset-mute').click(function () { var user = $(this).parent().find('.muted').html(); storage.removeListItem('muted', user); sb.reRenderPosts(); $(this).parent('li').remove(); if (!$('.reset-mute').length) { $('#sb-menu').remove(); } }); }, attachUserMenuEvents(){ $('.user-option').off(); $('.user-option.mark').click(function () { var user = $(this).parent().attr('data-user'); var marked = storage.get('marked'); if (marked == user) { storage.set('marked', null); } else { storage.set('marked', user); } sb.reRenderPosts(); }); $('.user-option.send-mail').click(function () { var user = $(this).parent().attr('data-user'); sidebar.showMessageModal({type: 'new', user: user}); }); $('.user-option.mute-user').click(function () { var user = $(this).parent().attr('data-user'); storage.setList('muted', user); sb.updateSbMenu(); sb.reRenderPosts(); }); }, renderMutedUsers(){ var muted = storage.getList('muted'); if (muted.length) { var html = '<li><i class="fa fa-ban" aria-hidden="true"></i> Muted<ul id="muted" class="sub-menu hidden">'; for (var idx in muted) { html += '<li><span class="muted">' + muted[idx] + '</span> <i class="fa fa-minus-square reset-mute" aria-hidden="true"></i></li>'; } html += '</ul></li>'; return html; } return ''; }, renderBox(){ var html = '<section id="shoutbox"><section id="shoutbox"><div><dl id="sbPosts">'; html += this.getPostsHtml(); html += '</div></dl></section>'; return html; }, }; var sidebar = { messages: [], fullSync: false, maxMessages: 100, refreshIntervalMessages: 10000, refreshIntervalUserOnline: 30000, userOnline: {}, seriesGenre: {}, series: [], init(){ this.refreshMessages(); this.refreshUserOnline(); this.renderSidebar(); }, getMessages(page){ var self = this; GM_xmlhttpRequest({ method: "GET", url: "https://bs.to/messages/" + page, headers: { 'Cookie': document.cookie, }, onload: function (res) { self.extractMessages(res.responseText, page); } }); }, insertShoutbox(){ var self = this; GM_xmlhttpRequest({ method: "GET", url: "https://bs.to", headers: { 'Cookie': document.cookie, }, onload: function (res) { var shoutbox = $(res.responseText).find('#shoutbox'); $('body').prepend('<section class="home draggable" style="width:400px"><div class="column" style="width:100%"><section id="shoutbox">' + shoutbox.html() + '</section></div></section>'); $('body').find('#sbUser').remove(); $('.draggable').draggable().css('position', 'fixed').css('left', '9px').css('top', '140px').css('z-index', '11'); $('#shoutbox header h3').css('cursor', 'move'); sb.box = $('#sbPosts'); $('#sbMsg').css('width', '100% !important').css('box-sizing', 'border-box'); sidebar.init(); sb.init(); } }); }, getUserOnline(page){ var self = this; GM_xmlhttpRequest({ method: "GET", url: "https://bs.to/ajax/sb-user.php", headers: { 'Cookie': document.cookie, }, onload: function (res) { var data = JSON.parse(res.responseText); self.userOnline = data.user; self.renderUserOnline(); } }); }, getMessage(id){ var self = this; GM_xmlhttpRequest({ method: "GET", url: "https://bs.to/messages/read:" + id, headers: { 'Cookie': document.cookie, }, onload: function (res) { var messageText = $(res.responseText).find('.message-read p').html(); var message = storage.getObjectListItem('messages', id); //console.log(message); message.text = messageText; message.status = 'read'; storage.setObjectListItem('messages', id, message); self.showMessageModal(message); self.renderMessages(); } }); }, getSeries(){ var self = this; if (self.series.length === 0) { GM_xmlhttpRequest({ method: "GET", url: "https://bs.to/andere-serien", headers: { 'Cookie': document.cookie, }, onload: function (res) { var seriesContainer = $(res.responseText).find('#seriesContainer'); seriesContainer.find('.genre').each(function (index) { var genre = $(this).find('span').text(); var series = []; $(this).find('li').each(function (index) { var name = $(this).text(); var url = 'https://bs.to/' + $(this).find('a').attr('href'); series.push({name: name, url: url}); self.series.push({name: name, url: url}); }); self.seriesGenre[genre] = series; }); self.renderSeries(); } }); } else { self.renderSeries(); } }, sendMessage(){ var self = this; var mm = $('#message-modal'); var text = mm.find('.message').val(); var subject = mm.find('.subject').val(); var receiver = mm.find('.receiver').val(); GM_xmlhttpRequest({ method: "POST", data: $.param({'newmsg[to]': receiver, 'newmsg[subject]': subject, 'newmsg[text]': text}), url: "https://bs.to/messages/new", headers: { "Content-Type": "application/x-www-form-urlencoded", 'Cookie': document.cookie, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Referer': 'https://bs.to/messages/new', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36', 'host': 'bs.to', 'Origin': 'https://bs.to' }, onload: function (res) { $('#message-modal').iziModal('close'); this.extractMessages(res.responseText, 1); } }); }, extractMessages(html, page){ var table = $(html).find('table'); var next = true; table.find('tr').each(function (index) { var message = {}; if (index > 0) { var cols = $(this).find('td'); message.status = $(this).attr('class') == 'unread' ? 'unread' : 'read'; message.id = $(cols[1]).find('a').attr('href').match(/\d+/)[0]; message.subject = $(cols[1]).text(); message.sender = $(cols[2]).text(); message.receiver = $(cols[3]).text(); message.time = $(cols[4]).text(); message.type = message.sender == 'Dir' ? 'outgoing' : 'incoming'; message.archived = false; if (storage.isInObjectList('messages', message.id) && !this.fullSync) { next = false; } storage.setObjectListItem('messages', message.id, message); } }); if (!$(html).find('.pages .current').next('.disabled').length && next) { this.getMessages(page + 1); } else { this.renderMessages(); } }, strMatch(str, search){ var words = search.toLowerCase().split(' '); var count = 0; for (var idx in words) { var regex = new RegExp(words[idx], 'g'); if (str.toLowerCase().match(regex)) { count++; } } return words.length == count ? true : false; }, refreshMessages(){ var self = this; self.getMessages(1); setInterval(function () { self.getMessages(1); }, self.refreshIntervalMessages); }, refreshUserOnline(){ var self = this; self.getUserOnline(); setInterval(function () { self.getUserOnline(); }, self.refreshIntervalUserOnline); }, searchSeries(str){ var results = []; for (var idx in this.series) { if (this.strMatch(this.series[idx].name, str)) { results.push(this.series[idx]); } } return results; }, renderSeries(){ var selected = storage.get('selectedGenre'); var search = $('#search-box').val(); var html = '<div id="series-container" class="scroll-box">'; var data; if (selected || search) { if (selected == 'favorites' && !search) { data = this.series; } else { data = search ? this.searchSeries(search) : this.seriesGenre[selected]; } html += `<div class="list-item reset-genre pointer"> <span class="item">..</span> </div>`; for (var series in data) { if (selected == 'favorites' && storage.isInList('favorites', data[series].name) || selected != 'favorites' && selected != 'genre') { var add = '<i title="Zu Favoriten hinzufuegen" class="fa fa-plus-square event" data-action="add" aria-hidden="true"></i>'; var remove = '<i title="Aus Favoriten entfernen" class="fa fa-ban event" data-action="remove" aria-hidden="true"></i>'; html += `<div class="list-item" data-url="` + data[series].url + `" data-name="` + data[series].name + `"> <span class="series item"><a target="_self" href="` + data[series].url + `">` + data[series].name + `</a></span> <span class="action"> <i title="Serie in TextBox einfügen" onclick="Shoutbox.addSmiley('` + data[series].url + `')" class="fa fa-clone" aria-hidden="true"></i> ` + (storage.isInList('favorites', data[series].name) ? remove : add) + ` </span> </div>`; } } } else { html += `<div class="list-item genre item" data-genre="favorites"> <span class="name item">Favoriten</span> <span class="count">(` + storage.getList('favorites').length + `)</span> </div>`; for (var genre in this.seriesGenre) { html += `<div class="list-item genre item" data-genre="` + genre + `"> <span class="name item">` + genre + `</span><span class="count">(` + this.seriesGenre[genre].length + `)</span> </div>`; } } html += '</div>'; if (storage.get('content') == 'series') { $('#sb-content').html(html); } this.attachSeriesEvents(); }, attachSeriesEvents(){ $("#series-container .list-item.genre ").click(function () { storage.set('selectedGenre', $(this).attr('data-genre')); sidebar.renderSeries(); }); $("#series-container .reset-genre").click(function () { storage.set('selectedGenre', null); $('#search-box').val(''); sidebar.renderSeries(); }); $("#series-container .event").click(function () { var scrollPos = $('#series-container').scrollTop(); var action = $(this).attr('data-action'); var name = $(this).parents('.list-item').attr('data-name'); if (action == 'add') { storage.setList('favorites', name); } else { if (confirm('Serie ' + name + ' entfernen?')) { storage.removeListItem('favorites', name); } } sidebar.renderSeries(); $('#series-container').scrollTop(scrollPos); }); }, renderMessages(){ var search = $('#search-box').val(); var messages = storage.getList('messages'); var scrollPos = $('#message-container').scrollTop(); var keys = Object.keys(messages).sort().reverse(); var html = '<div id="message-container" class="scroll-box"><div class="messages">'; var filter = storage.get('message_filter'); var counter = 0; var newMessages = 0; for (var i = 0; i < keys.length; i++) { var message = messages[keys[i]]; if (counter <= this.maxMessages && (!search || this.strMatch(message.subject, search) || message.type == 'incoming' && this.strMatch(message.sender, search) || message.type == 'outgoing' && this.strMatch(message.receiver, search))) { var sender = '<span class="sender">' + message.sender + '</span>'; var receiver = '<span class="receiver">' + message.receiver + '</span>'; var unread = '<i class="fa fa-envelope" aria-hidden="true"></i>'; var read = '<i class="fa fa-envelope-open" aria-hidden="true"></i>'; var status = message.status == 'read' ? read : unread; var m = '<div class="message ' + message.status + '" data-id="' + message.id + '"><div class="message-details ' + message.type + '">'; m += message.type == 'incoming' ? '<span>Von: </span>' + sender : '<span>An: </span>' + receiver; m += '<span class="status">' + status + '</span><span class="time">' + message.time + '</span></div>'; m += '<div class="subject">' + message.subject + '</div></div>'; html += filter == message.status ? m : ''; html += filter == message.type ? m : ''; html += filter === '' ? m : ''; newMessages += message.type == 'incoming' && message.status == 'unread' ? 1 : 0; counter++; } } html += '</div></div>'; if (storage.get('content') == 'messages') { $('#sb-content').html(html); } $('#sidebar .header #new-messages').html(newMessages); if (newMessages === 0) { $('#sidebar .header #new-messages').addClass('hidden'); $('#sidebar #unread').addClass('no-messages'); } else { $('#sidebar .header #new-messages').removeClass('hidden').fadeIn(); $('#sidebar #unread').removeClass('no-messages'); } $('#message-container').scrollTop(scrollPos); this.attachMessageEvents(); }, attachMessageEvents(){ $("#sidebar .messages .subject").click(function () { var id = $(this).parent().attr('data-id'); var message = storage.getListItem('messages', id); if (message.text !== undefined) { sidebar.showMessageModal(message); } else { sidebar.getMessage(id); } }); }, renderUserOnline(){ var search = $('#search-box').val(); var html = '<div id="user-online" class="scroll-box">'; var scrollPos = $('#user-online').scrollTop(); for (var idx in this.userOnline) { var user = this.userOnline[idx]; if (!search || this.strMatch(user.user, search)) { var add = !storage.isInList('friends', user.user) ? '<i class="fa fa-user-plus add-friend" aria-hidden="true"></i>' : ''; var mail = '<i class="fa fa-envelope new-message" aria-hidden="true"></i>'; html += '<div class="user-container" data-user="' + user.user + '"><span class="user-name ' + user.rank + '">' + user.user + '</span><span class="action">' + add + mail + '</span></div>'; } } if (storage.get('content') == 'user-online') { $('#sb-content').html(html); } $('#user-online').scrollTop(scrollPos); this.attachUserOnlineEvents(); }, isOnline(user){ for (var idx in this.userOnline) { if (this.userOnline[idx].user == user) { return true; } } return false; }, attachUserOnlineEvents(){ $("#sidebar #user-online .add-friend").click(function () { var user = $(this).closest('.user-container').attr('data-user'); storage.setList('friends', user); sidebar.renderUserOnline(); sb.reRenderPosts(); }); $("#sidebar #user-online .new-message").click(function () { var user = $(this).closest('.user-container').attr('data-user'); sidebar.showMessageModal({type: 'new', user: user}); }); }, getSortedFriendList(){ var online = []; var offline = []; var friends = storage.getList('friends'); for (var idx in friends) { var friend = friends[idx]; if (friend !== null && this.isOnline(friend)) { online.push(friend); } else { offline.push(friend); } } return {online: online, offline: offline.sort()}; }, renderFriends(){ var search = $('#search-box').val(); var friends = this.getSortedFriendList(); var html = '<div id="friends" class="scroll-box">'; var scrollPos = $('#friends').scrollTop(); for (var status in friends) { for (var idx in friends[status]) { var friend = friends[status][idx]; if (!search || this.strMatch(friend, search)) { var remove = '<i class="fa fa-ban remove-friend" aria-hidden="true"></i>'; var mail = '<i class="fa fa-envelope new-message" aria-hidden="true"></i>'; html += '<div class="user-container ' + status + '" data-user="' + friend + '"><span class="user-name">' + friend + '</span><span class="action">' + remove + mail + '</span></div>'; } } } if (storage.get('content') == 'friends') { $('#sb-content').html(html); } $('#friends').scrollTop(scrollPos); this.attachFriendsEvents(); } , attachFriendsEvents() { $("#sidebar #friends .remove-friend").click(function () { var user = $(this).closest('.user-container').attr('data-user'); if (window.confirm("Benutzer " + user + ' loeschen?')) { storage.removeListItem('friends', user); sidebar.renderFriends(); sb.reRenderPosts(); } }); $("#sidebar #friends .new-message").click(function () { var user = $(this).closest('.user-container').attr('data-user'); sidebar.showMessageModal({type: 'new', user: user}); }); } , renderNavigation() { var filter = storage.get('message_filter'); var content = storage.get('content'); var searchBox = '<input type="input" id="search-box" class="search-input" placeholder="Suche:">'; var mode = ` <select id="message-filter"> <option value="incoming" ` + (filter == 'incoming' ? 'selected' : '') + `>Posteingang</option> <option value="outgoing" ` + (filter == 'outgoing' ? 'selected' : '') + `>Gesendet</option> <option value="unread" ` + (filter == 'unread' ? 'selected' : '') + `>Ungelesen</option> <option value="" ` + (filter === '' ? 'selected' : '') + `>Alle</option> </select>`; var nav = ` <ul class="nav"> <!--<li data-content="settings" class="menu-item ` + (content == 'settings' ? 'active' : '') + `"><i class="fa fa-cogs" aria-hidden="true"></i></li>--> <li data-content="series" class="menu-item ` + (content == 'series' ? 'active' : '') + `"><i class="fa fa-film" aria-hidden="true"></i></li> <li data-content="user-online" class="menu-item ` + (content == 'user-online' ? 'active' : '') + `"><i class="fa fa-users" aria-hidden="true"></i></li> <li data-content="friends" class="menu-item ` + (content == 'friends' ? 'active' : '') + `"><i class="fa fa-address-book" aria-hidden="true"></i></li> <li data-content="messages" class="menu-item ` + (content == 'messages' ? 'active' : '') + `"><i class="fa fa-envelope" aria-hidden="true"></i></li> <li id="filter" style="` + (content != 'messages' ? 'display:none' : '') + `">` + mode + `</li> </ul><div style="` + (content == 'settings' ? 'display:none' : '') + `">` + searchBox + `</div> <span id="unread" class="no-messages"><span id="new-messages" class="hidden"></span><i class="fa fa-envelope" aria-hidden="true"></i></span>`; $('#sidebar .header').html(nav); this.attachNavigationEvents(); } , attachNavigationEvents() { $("#message-filter").change(function () { var value = $(this).val(); storage.set('message_filter', value); sidebar.renderMessages(); }); $("#sidebar .menu-item").click(function () { var value = $(this).attr('data-content'); storage.set('content', value); $("#sidebar .menu-item").removeClass('active'); $(this).addClass('active'); sidebar.renderNavigation(); sidebar.renderContent(); }); $("#search-box").keyup(function () { var content = storage.get('content'); if (content == 'messages') { sidebar.renderMessages(); } else if (content == 'user-online') { sidebar.renderUserOnline(); } else if (content == 'friends') { sidebar.renderFriends(); } else if (content == 'series') { sidebar.renderSeries(); } }); } , renderContent() { var content = storage.get('content'); $('#sb-content .scroll-box').html(''); if (content == 'messages') { this.renderMessages(); } else if (content == 'user-online') { this.getUserOnline(); } else if (content == 'friends') { this.getUserOnline(); this.renderFriends(); } else if (content == 'series') { this.getSeries(); } $('#sb-content .scroll-box').hide().fadeIn(); } , renderSidebar() { var html = '<div id="sidebar" class="left"><div class="header"></div><div id="sb-content"></div>'; $('#sidebar').remove(); $('body').prepend(html); this.renderNavigation(); this.renderContent(); } , showMessageModal(message) { var modal = `<div id="message-modal" class="iziModal"> <div class="content-wrapper">` + (message.text || '') + `</div> </div>`; var messageInputs = ` <label>Empfänger:</label> <input type="text" class="receiver" placeholder="Empfänger" name="newmsg[to]" value="` + (message.sender || message.user) + `"> <label>Betreff:</label><input type="text" class="subject" placeholder="Betreff" value="` + (message.subject || '') + `" name="newmsg[subject]"> <label>Nachricht:</label> <textarea class="message" name="newmsg[text]"></textarea> <button class="btn-submit" id="send-message" >Absenden</button>`; $('#message-modal').iziModal('close'); $('#message-modal').remove(); $('.iziModal-overlay').remove(); $('body').prepend(modal); var title = message.subject !== undefined ? message.subject + ', <span>' + message.time + '</span> <i class="fa fa-reply" aria-hidden="true"></i>' : 'Neue Nachricht verfassen'; $("#message-modal").iziModal({ title: title, subtitle: message.sender || '', headerColor: '#88A0B9', width: '50%', }); $('#message-modal').iziModal('open'); if (message.type !== undefined && message.type == 'new') { $('#message-modal .content-wrapper').html(messageInputs); $('#send-message').click(function () { sidebar.sendMessage(); }); } else { $('#message-modal .iziModal-header-title').click(function () { $('#message-modal .content-wrapper').html(messageInputs); $('#send-message').click(function () { sidebar.sendMessage(); }); }); } } , }; $("head").append('<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script>'); $("head").append('<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">'); $("head").append('<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/izimodal/1.4.2/js/iziModal.min.js"></script>'); $("head").append('<link href="https://cdnjs.cloudflare.com/ajax/libs/izimodal/1.4.2/css/iziModal.min.css" rel="stylesheet" type="text/css">'); $("head").append('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" />'); GM_addStyle(` .truncate { display: block; white-space: nowrap; width: 75%; overflow: hidden; text-overflow: ellipsis } #sbPosts .user-menu { display:none; float: right; color: #4376c3; padding-right: 10px } .user-menu .user-option{ padding-right:10px; cursor:pointer; } #sbPosts dt:hover .user-menu{ display:inherit; } #sbPosts .highlight { background-color: #ffdfa4 !important } #sbPosts .highlight-me { background-color: #77a2f1 !important } #sbPosts .marked{ background-color: #fdb9b9 !important } .fa-ban, .remove-friend { color: #ec6060; } #shoutbox h3 { display: inline } #sb-menu { float: right } #sb-menu>li { position: relative } #sb-menu .sub-menu { position: absolute; right: 0px; min-width: 200px } #sb-menu .sub-menu li { background: #d4d4d5 !important; padding: 2px 6px; color: #000 } #sb-menu .sub-menu li:hover { background: orange !important; color: #fff } #sb-menu .sub-menu li .fa { float: right; padding-left: 5px; padding-top: 3px; cursor: pointer }`); //styles sidebar GM_addStyle(` #sidebar.left{ width: 350px; position: fixed; background: #cfcfcf; height:34px; top: 90px; padding:10px 0; overflow:hidden; left: -265px; opacity: .5; z-index:9999; box-shadow: 0px 0px 6px 0px #000; } #sidebar #message-filter{ display: none; } #sidebar.left:hover #message-filter{ display:block; } #sidebar.left:hover,.left.always-visible{ left:0px; height:auto; opacity: 1; transition: opacity 0.6s; } #sidebar.left:hover #unread{ right:10px; //display:none; } #sidebar .header{ padding: 0px 10px 10px 10px; position: relative; } #sidebar #unread { position: absolute; font-size: 40px; color: #fbab34; right: 30px; top: -13px; } #sidebar #unread.no-messages{ color:#fff; right: 25px; } #sidebar .nav>li{ display:inline-block; font-size:25px; color:#094b85; margin-right:10px; vertical-align: middle; } #sidebar .nav .menu-item{ cursor:pointer;reset(); } #sidebar .nav li.active{ color:#fbab34; } #sidebar.right{ border-radius: 5px 0 0 5px; } #sidebar.left{ border-radius: 0 5px 5px 0; } #sidebar.left .action{ float:right; padding-left:5px; } #sidebar.left .action .fa{ padding-left:7px; cursor:pointer; } #sidebar.left .action .fa:hover{ color:orange; } #sb-content #user-online,#sb-content #friends{ padding:5px 10px; } #sb-content .user-container.online{ background: #dbf5db; } #sb-content .user-container{ padding: 10px; border: 1px solid #ccc; border-radius: 5px; margin-bottom: 5px; color: gray; } #sb-content .user-container .mod{ color:#90d0f5; } #sb-content .user-container .cmod{ color:#a363d4; } #sb-content .user-container .smod{ color:#a3d4a1; } #sb-content .user:hover{ border-color:orange } #sb-content .scroll-box{ height:calc(100vh - 350px); background: #fff; overflow: hidden; overflow-y: scroll; } #message-container .time { float: right; } #message-container .status { float: right; padding-left: 10px } #message-container .message-details { background: #aec2e1; padding: 5px } #message-container .subject { padding: 5px; cursor:pointer; } #message-container .unread .fa { color: orange } #message-container .read .fa { color: #fff } #message-container .message { border: 1px solid #ccc; border-radius: 5px; margin: 7px; overflow: hidden; } #message-container .message:hover { box-shadow: 0px 0px 6px 0px #adadad; } .iziModal-content{ height:70vh; } .iziModal-content .content-wrapper{ padding:15px; } #message-modal .iziModal-header-title{ cursor:pointer; } #message-modal .receiver,#message-modal .subject{ width:70%; margin-bottom:15px; } #message-modal .message{ width:100%; height:calc(70vh - 270px); box-sizing: border-box; margin-bottom:15px; } #message-modal .btn-submit{ padding: 12px;font-size: 20px; } #new-messages{ font-size: 15px; font-weight: bold; color: white; background: #F44336; border-radius: 50%; width: 20px; height: 20px; display: inline-block; text-align: center; position: absolute; right: -8px; top: 7px; } .search-input{ width:100%; margin-top:10px; box-sizing: border-box; } #series-container .item{ margin:10px; } #series-container .list-item{ margin: 10px; padding: 5px; border: 1px solid #ccc; border-radius: 5px; } #series-container .item a{ overflow: hidden; display:inline-block; text-overflow: ellipsis; white-space: nowrap; width:75%; } #series-container .list-item.genre:hover{ cursor:pointer; color:orange; } #series-container .actions{ float:right } #series-container .event{ padding-left:5px; } #series-container .fa:hover{ color:orange; curor:pointer; } .hidden{ display:none !important; } .pointer{ cursor:pointer; } .pointer:hover{ color:orange; } `); //storage.reset(); $(document).ready(function () { if ((window.location.href == 'https://bs.to/' || window.location.href == 'https://bs.to/home') && $('#navigation div strong').length) { sb.init(); sidebar.init(); } else if ($('#navigation div strong').length) { $.getScript("https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js", function () { if(sb.alwaysVisible){ $('#root').css('margin', '10px').css('margin-left', '420px'); sidebar.insertShoutbox(); }else{ sidebar.init(); } }); } });