* @version DS-E V/2
*/
$str_filename = basename(__FILE__);
require_once('common.php');
define('MAX_LOG_TIME',1800);
if(!$session['user']['loggedin'] || !$access_control->su_check(access_control::SU_RIGHT_COMMENT))
{
exit;
}
//entschärft, trifft ja doch nur die Zweitchars der MODs... $access_control->su_check(access_control::SU_RIGHT_COMMENT,true);
// MAIN SWITCH
$op = ($_REQUEST['op'] ? $_REQUEST['op'] : '');
switch($op) {
// Kommentar löschen (Achtung: httpreq!)
case 'transfer_comment':
$ids = '';
if(isset($_POST['commentid'])) {
$ids = addslashes($_POST['commentid']);
}
$bool_to = (bool)$_GET['to'];
$sql = "UPDATE commentary SET deleted_by = ".($bool_to ? "0" : $session['user']['acctid'])." WHERE commentid ".($ids != '' ? ' IN(-1'.$ids.')' : '='.$_GET['commentid']);
db_query($sql);
jslib_http_command('/mb '.db_affected_rows().' Kommentar(e) erfolgreich
'.($bool_to ? 'wiederhergestellt!
Zu Kommentaren':'in Papierkorb verschoben!
Zum Papierkorb'));
exit();
break;
// Kommentar als Spam markieren / demarkieren (Achtung: httpreq!)
case 'mark_spam':
$id = (int)$_GET['commentid'];
if($id <= 0) {
exit();
}
$sql = 'SELECT c.* FROM `commentary` c
WHERE c.commentid='.$id;
$res = db_query($sql);
if(!db_num_rows($res)) {
exit();
}
$arr_comment = db_fetch_assoc($res);
$sql = 'SELECT a.* FROM `accounts` a
WHERE a.acctid='.$arr_comment['author'];
$res = db_query($sql);
if(!db_num_rows($res)) {
$arr_user = array();
}
else {
$arr_user = db_fetch_assoc($res);
$arr_inst = createClassifierInstance($arr_comment,$arr_user);
$bool_spam = (bool)$_GET['spam'];
$classifier = CNaiveBayes::load(SPAM_CLASSIFIER_NAME);
if($classifier == null) {
exit();
}
// Als Spam markiert
if($bool_spam) {
$sql = "UPDATE commentary SET deleted_by = ".$session['user']['acctid']."
WHERE commentid =".$_GET['commentid'];
db_query($sql);
}
else {
// Spam-Markierung entfernen
$sql = "UPDATE commentary SET flags = flags ^ ".COMMENTARY_SPAM."
WHERE commentid =".$_GET['commentid'];
db_query($sql);
}
// False + True Positives in zusätzlicher Tabelle speichern:
$arr_data = array_merge($arr_inst,$arr_comment);
db_insert('commentary_spam',
array('data'=>$arr_data,'commentid'=>$arr_comment['commentid'],'spam'=>$_GET['spam']));
$classifier->addInstance($arr_inst,($bool_spam ? 1 : 0));
$classifier->save();
// Zusätzlich neuen Classifier trainieren
$classifierNew = CNaiveBayes::load(SPAM_CLASSIFIER_NAME.'_new');
if(is_null($classifierNew)) {
$classifierNew = new CNaiveBayes(SPAM_CLASSIFIER_NAME.'_new',array('dks','len','nmun','lowerupperratio','says_pattern','contains_trash'),array(0,1));
}
$arr_comment['comment'] = strip_appoencode($arr_comment['comment']);
$matches = array();
$int_lowerChars = preg_match_all('/[[:lower:]]/',$arr_comment['comment'],$matches,null,1);
$int_upperChars = preg_match_all('/[[:upper:]]/',$arr_comment['comment'],$matches,null,1);
$int_upperChars = max($int_upperChars,1);
$ratio = round($int_lowerChars / $int_upperChars);
// Anzahl Majuskeln >= Anzahl Minuskeln
if($ratio <= 1) {
$inst['lowerupperratio'] = 1;
}
else if($ratio > 60) {
$inst['lowerupperratio'] = 2;
}
else {
$inst['lowerupperratio'] = 0;
}
$inst['contains_trash'] = preg_match('/[^\w\.:\-\?\!,"\'; ]/iu',$arr_comment['comment']);
$inst['says_pattern'] = preg_match('/: \w+:/u',$arr_comment['comment']);
$classifierNew->addInstance($inst,($bool_spam ? 1 : 0));
$classifierNew->save();
}
// END wenn Userdaten noch vorhanden
/*jslib_http_command('/mb '.db_affected_rows().' Kommentar(e) erfolgreich
'.($bool_to ? 'wiederhergestellt!
Zu Kommentaren':'in Papierkorb verschoben!
Zum Papierkorb'));*/
exit();
break;
default:
$str_out = '';
$BOOL_JSLIB_PLU_MI = true;
popup_header('Kommentar - Kontrolle',true);
$str_out .= '
`n';
// Evtl. Fehler / Erfolgsmeldungen anzeigen
if($session['message'] != '') {
$str_out .= '`n`b'.$session['message'].'`b`n`n';
$session['message'] = '';
}
// END Evtl. Fehler / Erfolgsmeldungen anzeigen
// Sections-Enum erstellen
$arr_search=array('Clearing_','guild-','house-','hut_','h_garden-','h_room','sqf','stables-');
$arr_replace=array('Waldlichtung ','Gilde ','Haus Nr. ','Berghütte ','Hausgarten ','Gemach in Haus ','Eichhörnchenfarm ','Stall in Haus ');
$sql = 'SELECT section,su_min FROM commentary WHERE su_min'.($access_control->su_check(access_control::SU_RIGHT_COMMENTPRIV) ? '>=0' : '<=1').' AND self=1 GROUP BY section ORDER BY section ASC';
$res = db_query($sql);
$str_section_enum = 'enum,,Alle Sektionen';
while($s = db_fetch_assoc($res)) {
$str_section_enum .= ','.$s['section'].','.str_replace($arr_search,$arr_replace,$s['section']);
}
db_free_result($res);
// Parameter ermitteln
$int_y_to = date('Y');
$int_m_to = date('m');
$int_d_to = date('d');
$int_y_from = $int_y_to;
$int_m_from = $int_m_to - 1;
if($int_m_from <= 0) {
$int_m_from += 12;
$int_y_from--;
}
$int_d_from = 1;
$int_max_length = -1;
$int_max_comments = -1;
$str_sort_order = 'asc';
/**
* Form Array erstellen
*/
$arr_form['mode'] = 'Modus,enum,,Standard,recent,Aktuellste Kommentare,deleted,Papierkorb,spam,SPAM-Verdacht,edited,Nachträglich editierte|?Eine Kategoriesuche ist nur möglich wenn Standard gewählt ist, Aktuellste und Papierkorb überschreiben die Kategorie';
$arr_form['account_id'] = 'AccountID ODER Login,int';
$arr_form['message'] = 'Stichwortsuche in Kommentar,text,50';
$arr_form['section'] = 'Kommentarsektion auswählen...,'.$str_section_enum;
$arr_form['section_search'] = '.. oder suchen,text,30';
$arr_form['only_rpg'] = 'Nur RP,bool';
if($access_control->su_check(access_control::SU_RIGHT_COMMENTPRIV))
{
$arr_form['view_private'] = 'Private Kommentare anzeigen,bool';
}
$arr_form[] = 'exclude_sections,divider';
$arr_form['exclude_houses'] = 'Häuser ausblenden?,checkbox,1';
$arr_form['exclude_guilds'] = 'Gilden ausblenden?,checkbox,1';
$arr_form[] = 'date_sort,divider';
$arr_form['from_d'] = 'VON Tag,enum_order,1,31';
$arr_form['from_m'] = 'VON Monat,enum_order,1,12';
$arr_form['from_y'] = 'VON Jahr,enum_order,'.($int_y_to-1).','.($int_y_to+1);
$arr_form['to_d'] = 'BIS Tag,enum_order,1,31';
$arr_form['to_m'] = 'BIS Monat,enum_order,1,12';
$arr_form['to_y'] = 'BIS Jahr,enum_order,'.($int_y_to-1).','.($int_y_to+1);
$arr_form[] = 'limit_sort,divider';
$arr_form['max_length'] = 'Maximale Kommentarlänge,int|?-1 Sucht nach allen Kommentaren, ein größerer Wert limitiert die Ausgabe';
$arr_form['max_comments'] = 'Kommentare pro Seite,int|?Anzahl der angezeigten Kommentare, -1 stellt auf Defaultwerte';
$arr_form['sort_order'] = 'Kommentare ordnen,enum,asc,Aufsteigend,desc,Absteigend';
/**
* Datenarray erstellen
*/
$arr_data['mode'] = stripslashes($_REQUEST['mode']);
$arr_data['account_id'] = stripslashes($_REQUEST['account_id']);
$arr_data['message'] = stripslashes($_REQUEST['message']);
$arr_data['section'] = stripslashes($_REQUEST['section']);
$arr_data['section_search'] = stripslashes($_REQUEST['section_search']);
$arr_data['only_rpg'] = (bool)$_REQUEST['only_rpg'];
if($access_control->su_check(access_control::SU_RIGHT_COMMENTPRIV))
{
$arr_data['view_private'] = (isset($_REQUEST['view_private']))?(bool)$_REQUEST['view_private']:true;
}
else
{
$arr_data['view_private'] = false;
}
if($arr_data['mode'] == 'edited')
{
$arr_data['only_rpg'] = false;
}
$arr_data['exclude_houses'] = (1 == (int)$_REQUEST['exclude_houses']) ? 1 : 0;
$arr_data['exclude_guilds'] = (1 == (int)$_REQUEST['exclude_guilds']) ? 1 : 0;
$arr_data['from_d'] = (empty($_REQUEST['from_d']) ? $int_d_from : (int)$_REQUEST['from_d']);
$arr_data['from_m'] = (empty($_REQUEST['from_m']) ? $int_m_from : (int)$_REQUEST['from_m']);
$arr_data['from_y'] = (empty($_REQUEST['from_y']) ? $int_y_from : (int)$_REQUEST['from_y']);
$arr_data['to_d'] = (empty($_REQUEST['to_d']) ? $int_d_to : (int)$_REQUEST['to_d']);
$arr_data['to_m'] = (empty($_REQUEST['to_m']) ? $int_m_to : (int)$_REQUEST['to_m']);
$arr_data['to_y'] = (empty($_REQUEST['to_y']) ? $int_y_to : (int)$_REQUEST['to_y']);
$arr_data['max_length'] = (empty($_REQUEST['max_length']) ? $int_max_length : (int)$_REQUEST['max_length']);
$arr_data['max_comments'] = (empty($_REQUEST['max_comments']) ? $int_max_comments : (int)$_REQUEST['max_comments']);
$arr_data['sort_order'] = (empty($_REQUEST['sort_order']) ? $str_sort_order : stripslashes($_REQUEST['sort_order']));
if( (int)$arr_data['account_id'] == 0 && !empty($arr_data['account_id']) ) {
$arr_tmp = db_fetch_assoc(db_query('SELECT acctid FROM accounts WHERE login="'.addslashes($arr_data['account_id']).'" LIMIT 1'));
if($arr_tmp['acctid'] > 0) {
$arr_data['account_id'] = $arr_tmp['acctid'];
}
else {
$arr_data['account_id'] = 0;
}
}
$str_date_from = '';
$str_date_to = '';
if($arr_data['from_d'] > 0 && $arr_data['from_m'] > 0 && $arr_data['from_y'] > 0) {
$str_date_from = $arr_data['from_y'].'-'.$arr_data['from_m'].'-'.$arr_data['from_d'].' 00:00:00';
}
if($arr_data['to_d'] > 0 && $arr_data['to_m'] > 0 && $arr_data['to_y'] > 0) {
$str_date_to = $arr_data['to_y'].'-'.$arr_data['to_m'].'-'.$arr_data['to_d'].' 23:59:59';
}
// Logs schreiben
if(!empty($arr_data['account_id'])) {
if(!isset($session['logs']['suwatch']['u'.$arr_data['account_id']]) || time()-$session['logs']['suwatch']['u'.$arr_data['account_id']] > MAX_LOG_TIME) {
debuglog("`&Kommentare geprüft:",$arr_data['account_id']);
$session['logs']['suwatch']['u'.$arr_data['account_id']] = time();
}
}
// Query bauen
if('spam' == $arr_data['mode']) {
$str_sql = 'SELECT c1.*,
a.name,a.login,a.acctid,a.activated,a.loggedin,a.laston,a.location,a.superuser
FROM commentary c1
LEFT JOIN accounts a ON a.acctid = c1.author
INNER JOIN (SELECT section,postdate FROM commentary WHERE flags = flags | '.COMMENTARY_SPAM.' AND deleted_by=0) c2
ON c1.section=c2.section
WHERE c1.deleted_by = 0 AND TIMEDIFF(c1.postdate,c2.postdate) < 3600
ORDER BY c1.section, c1.commentid';
$str_count_sql = 'SELECT COUNT(*) AS C
FROM commentary c1
INNER JOIN (SELECT section,postdate FROM commentary WHERE flags = flags | '.COMMENTARY_SPAM.' AND deleted_by=0) c2
ON c1.section=c2.section
WHERE c1.deleted_by = 0 AND TIMEDIFF(c1.postdate,c2.postdate) < 3600';
}
else {
$str_sql = 'SELECT c.*,
a.name,a.login,a.acctid,a.activated,a.loggedin,a.laston,a.location,a.superuser
'.($arr_data['mode'] == 'deleted' ? ',a_su.login AS sulogin ' : '').
'FROM commentary c
LEFT JOIN accounts a ON a.acctid = c.author
'.($arr_data['mode'] == 'deleted' ? 'LEFT JOIN accounts a_su ON a_su.acctid = c.deleted_by' : '');
$str_count_sql = ' SELECT COUNT(*) AS c
FROM commentary c
LEFT JOIN accounts a ON a.acctid = c.author
';
$str_where = ' WHERE su_min '.(($access_control->su_check(access_control::SU_RIGHT_COMMENTPRIV) && $arr_data['view_private']) ? '>= 0' : '< 2').'
'.($arr_data['mode'] == 'deleted' ? 'AND deleted_by > 0' : 'AND deleted_by = 0').'
'.($arr_data['account_id'] > 0 ? 'AND c.author = "'.$arr_data['account_id'].'"' : '').'
'.($arr_data['only_rpg'] ? 'AND c.self = 1' : '').'
'.($arr_data['exclude_houses'] ? 'AND c.section NOT LIKE "house%" AND c.section NOT LIKE "h\_%"' : '').'
'.($arr_data['exclude_guilds'] ? 'AND c.section NOT LIKE "guild%" ' : '').'
'.($arr_data['max_length'] > -1 ? 'AND CHAR_LENGTH(c.comment) <= '.$arr_data['max_length'] : '').'
'.(!empty($arr_data['message']) ? 'AND c.comment LIKE "%'.addslashes($arr_data['message']).'%"' : '').'
'.(!empty($str_date_from) ? 'AND c.postdate >= "'.$str_date_from.'"' : '').'
'.(!empty($str_date_to) ? 'AND c.postdate <= "'.$str_date_to.'"' : '');
if($arr_data['mode'] == 'recent') {
$arr_data['section'] = '';
}
elseif($arr_data['mode'] == 'edited') {
$arr_data['section'] = 'comment_revision';
}
if(!empty($arr_data['section_search'])) {
$str_where .= 'AND section LIKE "%'.addslashes($arr_data['section_search']).'%"';
}
else {
if(!empty($arr_data['section'])) {
$str_where .= 'AND section = "'.addslashes($arr_data['section']).'"';
}
}
$str_count_sql .= $str_where;
$str_sql .= $str_where;
if($arr_data['mode'] == 'recent') {
$str_sql .= ' ORDER BY postdate DESC,commentid DESC,su_min ASC,section ASC';
}
else {
$str_sql .= ' ORDER BY su_min ASC,section ASC,postdate DESC,commentid DESC';
}
}
// Seitenansicht
$str_baselnk = $str_filename . '?op=search&';
foreach($arr_data as $key => $val) {
$str_baselnk .= $key.'='.urlencode($val).'&';
}
// Wieviele Kommentare sollen pro Seite angezeigt werden
// -1 setzt Defaultwerte, alles andere setzt fixe Grenze
if($arr_data['max_comments'] < 0)
{
$int_comments_per_section = 300;
}
else
{
$int_comments_per_section = $arr_data['max_comments'];
}
$arr_page_res = page_nav($str_baselnk,($arr_data['mode'] == 'recent' ? 300 : $str_count_sql),$int_comments_per_section,' | ','');
// Query abschicken
$str_sql .= ' LIMIT '.$arr_page_res['limit'];
$res = db_query($str_sql);
//Ausgabe von ein paar Debug Infos
//admin_output($str_sql);
//admin_print_r($_REQUEST);
$arr_results = array();
while($c = db_fetch_assoc($res)) {
if(sizeof($arr_results[$c['section']]) >= $int_comments_per_section) {
continue;
}
$arr_results[$c['section']][$c['commentid']] = $c;
}
// Suchmaske anzeigen
$str_out .= '