There are 12 previous versions of this script.
Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)
// ==UserScript==
// @name DS #Posts
// @version 1.6
// @author Samuel Essig (http://c1b1.de)
// @description Zählt die Posts eines Members im Internen Forum
// @namespace c1b1.de
// @homepage http://c1b1.de
// @copyright 2009-2011, Samuel Essig (http://c1b1.de)
// @license CC Attribution-Noncommercial-Share Alike 3.0 Germany; http://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode
// @include http://*.die-staemme.de/*
// @exclude http://forum.die-staemme.de/*
// @icon http://www.die-staemme.de/favicon.ico
// @uso:script 52212
// ==/UserScript==
const version = '1.6';
/*
ds.countPosts.user.js
DS #Posts
(c) 2009-2011 by C1B1SE
info@c1b1.de
http://c1b1.de
############## Distribution Information ##############
All content by c1b1.de
Do not distribute this script without this logo.
######################## Logo ########################
___ __ ___ __
_____ < / / /_ < / ____/ / ___
/ ___/ / / / __ \ / / / __ / / _ \
/ /__ / / / /_/ / / / _ / /_/ / / __/
\___/ /_/ /_.___/ /_/ (_) \__,_/ \___/
######################################################
If you have any questions, comments,
ideas, etc, feel free to contact me
and I will do my best to respond.
mail:info@c1b1.de
skype:c1b1_se
http://c1b1.de
twitter: http://twitter.com/c1b1se
####################### License ######################
Shared under the 'CC Attribution-Noncommercial-Share Alike 3.0 Germany' License:
http://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode
English Summary of that license:
http://creativecommons.org/licenses/by-nc-sa/3.0/de/deed.en
####################### About it ######################
Uploaded @ http://userscripts.org/scripts/show/52212
Zählt die Posts eines Members im Forum.
Jeder Post wird mit md5 gehasht und in den Firefox Einstellungen abgelegt.
*/
function DS_Posts() {
var api = typeof unsafeWindow != 'undefined' ? unsafeWindow.ScriptAPI : window.ScriptAPI;
api?api.register('DS #Posts', 7.4, 'Samuel Essig', 'scripts@online.de'):api;
if ((typeof GM_getValue == 'undefined') || (GM_getValue('a', 'b') == undefined)) {
var gm_value_prefix = 'ds_posts';
GM_addStyle = function(css) {
var style = document.createElement('style');
style.textContent = css;
document.getElementsByTagName('head')[0].appendChild(style);
}
GM_deleteValue = function(name) {
localStorage.removeItem(gm_value_prefix+name);
}
GM_getValue = function(name, defaultValue) {
var value = localStorage.getItem(gm_value_prefix+name);
if (!value)
return defaultValue;
var type = value[0];
value = value.substring(1);
switch (type) {
case 'b':
return value == 'true';
case 'n':
return Number(value);
default:
return value;
}
}
GM_listValues = function()
{
var keys = [];
for(var key in localStorage) {
if(key.substring(0,gm_value_prefix.length) == gm_value_prefix) {
keys.push(key.substring(gm_value_prefix.length));
}
}
return keys;
}
GM_log = function(message) {
console.log(message);
}
GM_registerMenuCommand = function(name, funk) {
//todo
}
GM_setValue = function(name, value) {
value = (typeof value)[0] + value;
localStorage.setItem(gm_value_prefix+name, value);
}
if(typeof(unsafeWindow)=='undefined') { unsafeWindow=window; }
}
const debug = false;
const text = {
'de' : {
'_name' : 'DS #Posts ',
'_author' : 'C1B1SE',
'_contact' : 'mail:info@c1b1.de',
'_support' : 'http://forum.die-staemme.de/showthread.php?t=2432548',
'showData_button' : 'Daten anzeigen',
'clearData_button' : 'Daten löschen',
'compressData_button': 'Daten komprimieren',
'finished_alert' : 'Fertig',
'stillalpha_alert' : 'Noch nicht implementiert!',
'confirm_alert' : 'Wirklich?',
'playername' : 'Name' ,
'playerposts' : 'Posts' ,
'since' : 'Seit',
'countedPosts_heading' : 'Gezählte Posts'
}
};
const world = document.location.href.split('.').shift().split('de').pop();
const lang = document.location.href.split('.')[0].split(/\/\/(\D+)\d+/)[1];
GM_log = debug?GM_log:function(){};
Array.prototype.indexOf = function(el)
{
for(var i = 0; i < this.length; i++)
if(el == this[i])
return i;
return -1;
};
// Duke assistant?
var duke = $('#dukeassistantBar_anchor')||$('#dukeassistantBar')?true:false;
if(GM_url('http://*.die-staemme.de/*forum.php*screen=view_thread*') || GM_url('http://*.die-staemme.de/*screen=forum&screenmode=view_thread*')) // Post
{
// Bar
var a1 = n('a',{'href':'#'},['click',showData,false],false,text[lang].showData_button);
var a2 = n('a',{'href':'#'},['click',clearData,false],false,text[lang].clearData_button);
var a3 = n('a',{'href':'#'},['click',compressData_fct,false],false,text[lang].compressData_button);
bar(a1,a2,a3);
// Get compressed data
var gm = GM_getValue(lang+world+'#compressed');
var oldData = gm?JSON.parse(gm):{ids:[],players:{},from:-1,to:-1};
var to = oldData.to;
// Walk through posts
var posts = $('.post');
for(var i = 1; i < posts.length; i++)
{
var player_name = $('.postheader_left',posts[i])[0];
if(player_name.innerHTML.indexOf('(gelöscht)') != -1) // Jump deleted player
continue;
if(duke) {
player_name = trim($('.normal_link',player_name)[0].firstChild.data);
}
else {
player_name = trim($('a',player_name)[0].firstChild.data);
}
var post_id = posts[i].innerHTML.match(/quote_id=(\d+)&/); // this is a unique post id
if(!post_id) {
var post_id = posts[i].innerHTML.match(/<a name="(\d+)"><\/a>/);
} else {
post_id = post_id[1];
}
var time_string = grabText($('.postheader_left',posts[i])[0],1);
var post_time = parseFromDSTime(time_string).getTime();
if(oldData.ids.indexOf(post_id) != -1)
{
GM_log(post_id+' in archive');
}
else
{
var value_name = lang+world + '_' + post_time + '_' + player_name + '_' + post_id;
if(GM_getValue(value_name) !== true)
{
GM_setValue(value_name,true);
GM_log(post_id+' saved to db')
}
else
{
GM_log(post_id+' alread in db')
}
}
}
}
else if(GM_url('http://*.die-staemme.de/game.php(mode=members&screen=ally)')) // Memberlist
{
complementMemberlist();
}
function complementMemberlist()
{
compressData();
// Get the data
var gm = GM_getValue(lang+world+'#compressed');
var data = gm?JSON.parse(gm):{ids:[],players:{},from:-1,to:-1};
var table = $('#ally_content').$('table')[0];
var members = $('tr',table);
for(var i = 1; i < members.length; i++)
{
if(!$('a',members[i]))
continue;
if(duke) {
var name = trim($('.normal_link',members[i])[0].firstChild.nodeValue);
}
else {
var name = trim($('a',members[i])[0].firstChild.nodeValue);
}
var td = n('td',{'style':{textAlign:'right'}},false,data.players[name]?data.players[name]:'0');
members[i].appendChild(td);
}
var th = n('th',{'class':'int','style':'cursor:pointer; ','title':'Sortieren nach Posts'},['click',startSortingMemberlist,false],false,text[lang].playerposts)
members[0].appendChild(th);
}
function showData()
{
compressData();
// Get the data
var gm = GM_getValue(lang+world+'#compressed');
var oldData = gm?JSON.parse(gm):{ids:[],players:{},from:-1,to:-1};
var oldestPost = new Date();
oldestPost.setTime(oldData.from);
// Write
var main = $('.main',$('#forum_box')?$('#forum_box'):document)[0];
main.innerHTML = '';
var h2 = n('h2',{'id':'h2_counted_posts'},false,false,text[lang].countedPosts_heading+' ('+text[lang].since+' '+parseToDSTime(oldestPost)+')');
var tr = n('tr',false,false,false,n('th',{'class':'string','style':'cursor:pointer; ','title':'Sortieren nach Name'},['click',startSorting,false],false,text[lang].playername),n('th',{'class':'int','style':'cursor:pointer; ','title':'Sortieren nach Posts'},['click',startSorting,false],false,text[lang].playerposts));
var table = n('table',{'border':'0','class':'vis','style':{'border':'#804000 2px solid'}},false,false,tr);
for (p in oldData.players)
table.appendChild( n('tr',false,false,false,n('td',false,false,false,p),n('td',false,false,false,oldData.players[p])) );
main.appendChild(h2);
main.appendChild(table);
if($('.forum selected')[0])
$('.forum selected')[0].setAttribute('class','forum');
else if($('.shared_forum shared_selected')[0])
$('.shared_forum shared_selected')[0].setAttribute('class','shared_forum');
}
function startSorting(e)
{
if($('#sorting_table_loader'))
d('sorting_table_loader');
var div = n('div');
div.setAttribute('style','background:url(http://www.c1b1.de/smile/loader.gif) no-repeat; height:16px; padding-left:20px; color:Black; ');
div.setAttribute('id','sorting_table_loader');
div.appendChild(t('Sortiere Tabelle . . . '));
$('#h2_counted_posts').parentNode.insertBefore(div,$('#h2_counted_posts').nextSibling);
var y = this;
var x = function() {
sortTable.apply(y,[e]);
};
setTimeout(x,300); // Loading Gif can show up
}
function startSortingMemberlist(e)
{
if($('#sorting_table_loader'))
d('sorting_table_loader');
var div = n('div');
div.setAttribute('style','background:url(http://www.c1b1.de/smile/loader.gif) no-repeat; height:16px; padding-left:20px; color:Black; ');
div.setAttribute('id','sorting_table_loader');
div.appendChild(t('Sortiere Tabelle . . . '));
$('#ally_content').parentNode.insertBefore(div,$('#ally_content').nextSibling);
var y = this;
var x = function() {
sortTable.apply(y,[e]);
};
setTimeout(x,300); // Loading Gif can show up
}
function sortTable(ev)
{
var index = 0;
var e = this.previousSibling;
while(e) { index++; e = e.previousElementSibling; }
var table = this.parentNode.parentNode.parentNode;
var elist = $('tr',table);
var last = tmp = 0;
var i = 1;
if(this.className.indexOf('int') != -1)
{
while(i < elist.length)
{
tmp = parseInt($('td',elist[i])[index].firstChild.nodeValue);
if( tmp > last )
{
elist[i].parentNode.insertBefore(elist[i],elist[i-1<1?1:i-1]);
i = 1;
}
last = tmp;
i++;
}
}
else if(this.className.indexOf('string') != -1)
{
while(i < elist.length)
{
tmp = $('td',elist[i])[index].firstChild.nodeValue.toLowerCase().charCodeAt(0);
if( tmp < last )
{
elist[i].parentNode.insertBefore(elist[i],elist[i-1<1?1:i-1]);
i = 1;
}
last = tmp;
i++;
}
}
if($('#sorting_table_loader'))
d('sorting_table_loader');
}
function clearData()
{
if(!confirm(text[lang].confirm_alert))
return;
var arr = GM_listValues();
var w_len = (lang+world).length;
// Delete Data
for(var i = 0; i < arr.length; i++)
{
//if(arr[i].substr(0,w_len) == (lang+world) && arr[i].indexOf('#compressed') == -1)
if(arr[i].substr(0,w_len) == (lang+world))
{
GM_deleteValue(arr[i]);
}
}
alert(text[lang].finished_alert);
window.location.reload();
}
function compressData_fct(ev)
{
compressData();
alert(text[lang].finished_alert);
window.location.reload();
}
function compressData()
{
// Get the old data
var gm = GM_getValue(lang+world+'#compressed');
var oldData = gm?JSON.parse(gm):{ids:[],players:{},from:-1,to:-1};
var arr = GM_listValues();
var w_len = (lang+world).length;
var oldest = -1;
var recent = -1;
// Count Posts
for(var i = 0; i < arr.length; i++)
{
if(arr[i].substr(0,w_len) == (lang+world))
{
if(GM_getValue(arr[i]) === true)
{
var a = arr[i].split('_');
if(!a[1])
continue;
// Extract id
var id = parseInt(a.pop());
// Extract timestamp
var p_timestamp = parseInt(a[1]);
// Extract name
delete(a[0]);
delete(a[1]);
var p_name = ext_join(a,'_');
// Add 1
oldData.players[p_name]?oldData.players[p_name]++:oldData.players[p_name]=1;
// oldest & recent timestamps
oldest = oldest==-1?p_timestamp:(p_timestamp<oldest?p_timestamp:oldest);
recent = recent==-1?p_timestamp:(p_timestamp>recent?p_timestamp:recent);
// Block ID
oldData.ids.push(id);
GM_deleteValue(arr[i]);
}
}
}
oldData.to = recent;
oldData.from = oldData.from==-1?oldest:oldData.from;
GM_setValue(lang+world+'#compressed',JSON.stringify(oldData));
}
// Common functions
function ext_join(arr,d)
{
var x = 0;
while(arr[x] == undefined)
x++;
var re = arr[x++];
for(; x < arr.length; x++)
if(arr[x] != undefined)
re += d+arr[x];
return re;
}
function name(name) { return document.getElementsByName(name); };
function tag(name, parent)
{
if(!parent)
return document.getElementsByTagName(name);
return parent.getElementsByTagName(name);
}
function d(id) { document.getElementById(id).parentNode.removeChild(document.getElementById(id)); };
function n(type,attrs,evt,html,args)
{
var e = document.createElement(type);
if(attrs)
for(var attr in attrs)
if(attr == 'style' && typeof(attrs[attr]) == 'object')
for(var property in attrs[attr])
e.style[property] = attrs[attr][property];
else if(typeof(attrs[attr]) != typeof(new Function()))
e.setAttribute(attr,attrs[attr]);
if(evt)
e.addEventListener(evt[0],evt[1],evt[2]);
if(html)
e.innerHTML = html;
if(html === false)
for(var i = 4; i < arguments.length; i++)
if(!arguments[i].nodeType)
e.appendChild(document.createTextNode(arguments[i]));
else
e.appendChild(arguments[i]);
return e;
}
function t(str) { return document.createTextNode(str); };
function test(fct,elsewise) { try {fct();} catch(error) {}; return typeof(elsewise) == 'undefined' ? void(0) : elsewise ; }
function getChilds(mother,tagname)
{
if(tagname)
tagname = tagname.toUpperCase;
var element = mother.firstChild;
var childs = new Array();
while(element)
{
if((tagname && element.tagName && element.tagName.toUpperCase == tagname) || (!tagname && element.tagName))
childs.push(element);
element = element.nextSibling;
}
return childs;
}
function parseToDSTime(obj,secs)
{
var now = new Date();
if(!secs)
{
if(now.getMonth() == obj.getMonth() && now.getDate() == obj.getDate())
return 'heute um '+((obj.getHours()>9?obj.getHours():'0'+obj.getHours()) + ':' + (obj.getMinutes()>9?obj.getMinutes():'0'+obj.getMinutes())) + ' Uhr';
else if(now.getMonth() == obj.getMonth() && (now.getDate()+1) == obj.getDate())
return 'morgen um '+((obj.getHours()>9?obj.getHours():'0'+obj.getHours()) + ':' + (obj.getMinutes()>9?obj.getMinutes():'0'+obj.getMinutes())) + ' Uhr';
else
return (obj.getDate()>9?obj.getDate():'0'+obj.getDate()) + '.' + ((obj.getMonth()+1)>9?(obj.getMonth()+1):'0'+(obj.getMonth()+1)) + '.'+ (String(obj.getFullYear()).substr(2)) + ' ' + (obj.getHours()>9?obj.getHours():'0'+obj.getHours()) + ':' + (obj.getMinutes()>9?obj.getMinutes():'0'+obj.getMinutes()) + ':' + (obj.getSeconds()>9?obj.getSeconds():'0'+obj.getSeconds());
}
else
{
if(now.getMonth() == obj.getMonth() && now.getDate() == obj.getDate())
return 'heute um '+((obj.getHours()>9?obj.getHours():'0'+obj.getHours()) + ':' + (obj.getMinutes()>9?obj.getMinutes():'0'+obj.getMinutes()) + ':' + (obj.getSeconds()>9?obj.getSeconds():'0'+obj.getSeconds())) + ' Uhr';
else if(now.getMonth() == obj.getMonth() && (now.getDate()+1) == obj.getDate())
return 'morgen um '+((obj.getHours()>9?obj.getHours():'0'+obj.getHours()) + ':' + (obj.getMinutes()>9?obj.getMinutes():'0'+obj.getMinutes()) + ':' + (obj.getSeconds()>9?obj.getSeconds():'0'+obj.getSeconds())) + ' Uhr';
else
return (obj.getDate()>9?obj.getDate():'0'+obj.getDate()) + '.' + ((obj.getMonth()+1)>9?(obj.getMonth()+1):'0'+(obj.getMonth()+1)) + '.'+ (String(obj.getFullYear()).substr(2)) + ' ' + (obj.getHours()>9?obj.getHours():'0'+obj.getHours()) + ':' + (obj.getMinutes()>9?obj.getMinutes():'0'+obj.getMinutes()) + ':' + (obj.getSeconds()>9?obj.getSeconds():'0'+obj.getSeconds() + ':' + (obj.getSeconds()>9?obj.getSeconds():'0'+obj.getSeconds()));
}
}
function parseFromDSTime(string)
{
// Create Date Object
var now = new Date();
// Extract Time
var time = string.match(/(\d+):(\d+) Uhr/);
// Hours
if(time[1][0] == '0')
var hours = parseInt(time[1][1]);
else
var hours = parseInt(time[1]);
// Minutes
if(time[2][0] == '0')
var minutes = parseInt(time[2][1]);
else
var minutes = parseInt(time[2]);
// Today
if(string.indexOf('heute') != -1)
{
var days = now.getDate();
var months = now.getMonth();
}
// Tomorrow
else if(string.indexOf('morgen') != -1)
{
var days = now.getDate()+1;
var months = now.getMonth();
}
// Other day
else
{
// Extract Date e.g. "09.06."
var date = string.match(/(\d+)\.(\d+)\./);
// Day
if(date[1][0] == '0')
var days = parseInt(date[1][1]);
else
var days = parseInt(date[1]);
// Month
if(date[2][0] == '0')
var months = parseInt(date[2][1]) -1;
else
var months = parseInt(date[2]) -1;
}
// Return Date Object
return new Date(now.getFullYear(), months, days, hours, minutes, 0);
}
function bar()
{
if($('#dscountposts_bar'))
return false;
var div = n('div');
div.setAttribute('id','dscountposts_bar');
div.style.backgroundColor = 'rgb(243,237,223)';
div.style.border = 'rgb(128,64,0) 2px solid';
div.style.marginTop = '15px';
div.style.padding = '5px';
var leftfont = n('span');
leftfont.setAttribute('style','float:left; ');
for(var i = 0, len = arguments.length; len > i; i++)
{
leftfont.appendChild(arguments[i]);
if(len - 1 != i)
{
var delimiter = n('span');
delimiter.setAttribute('style','margin-left:5px; margin-right:5px; width:1px; border:1px #804000 solid; ')
leftfont.appendChild(delimiter);
}
}
div.appendChild(leftfont);
var rightfont = n('span');
rightfont.setAttribute('style','float:right; font-size:smaller; opacity:0.7; ');
rightfont.appendChild(t( text[lang]._name + '(' + version+')'));
div.appendChild(rightfont);
var clearfont = n('div');
clearfont.setAttribute('style','clear:both; ');
div.appendChild(clearfont);
return $('#ds_body').appendChild(div);
}
function grabText(node,maxDepth)
{
if(3 == node.nodeType)
return node.nodeValue;
else if((1 == node.nodeType) && (0 < maxDepth))
{
var result = '';
for(var i = 0; i < node.childNodes.length; i++)
result += grabText(node.childNodes[i],maxDepth - 1);
return result;
}
return '';
}
function trim(str)
{
return str.replace(/^\s+/, '').replace(/\s+$/, '');
}
function GM_url(pattern)
{
// Logical Comparison
var url = document.location.href;
if(pattern == url)
return true;
// No brackets, only replace stars
if(pattern.indexOf('(') == -1)
{
var reo = new RegExp(pattern.replace(/\*/gim,'(.*)'),'gim');
return reo.test(url);
}
// Test with placeholder, no brackets
var withoutbrackets = pattern;
withoutbrackets = withoutbrackets.replace(/\((.+)\)/gim,'(.+)'); // Replace Brackets
withoutbrackets = withoutbrackets.replace(/\*/gim,'(.*)') // Replace Stars
var occs = withoutbrackets.match(/(\(.+\))?(\(.*\))/);
var reo = new RegExp(withoutbrackets);
if(!reo.test(url))
{
return false;
}
// Extract the bracket content:
var matches = pattern.match(/\((.+)\)/)[1];
// Extract the match that should contain the bracket's content
var i = 0, str = withoutbrackets.split('(.+)').shift();
while(str.indexOf('(.*)') != -1)
{
str = str.substring(str.indexOf('(.*)')+4);
i++;
}
var match = url.match(reo)[i+1];
// Compare match to pattern
var parts = matches.split('&');
for(var i = 0; i < parts.length; i++)
{
if(match.indexOf(parts[i]) == -1)
return false;
}
return true;
}
function $(x,parent) {
var y = parent?parent:( this.document?this.document:this );
var add = function(l) { for(var i = 0; i < l.length; i++){ l[i].$ = $;} return l;};
if(x[0] == '#') {
var r = y.getElementById(x.substring(1));
if(r)
r.$ = $;
return r;
}
else if(x[0] == '.') {
var r = y.getElementsByClassName(x.substring(1))
return add(r);
}
else if(x[0] == '-') {
var r = y.getElementsByName(x.substring(1))
return add(r);
}
else {
var r = y.getElementsByTagName(x)
return add(r);
}
}
}
DS_Posts();