* @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 .= '
'.plu_mi('comment_search',0,true).' Kommentare durchsuchen

[ nach unten ]
'; // Liste erstellen if(sizeof($arr_results) == 0) { $str_out .= '`iKeine Ergebnisse gefunden!`i'; } else { $str_out .= ''; $str_out .= '`^`bSeiten:`b `0'.$arr_page_res['page_nav']; $str_comment = ''; require_once(LIB_PATH.'portals.lib.php'); foreach ($arr_results as $str_section => $arr_comments) { $str_out .= '
`b`^'.$str_section.':`&`b '.portal_st_section_comments($str_section).' '.($str_section != $arr_data['section'] ? '[ -> ]':'').'`n'; // passend sortieren (nach Kommentarid aufsteigend) ksort($arr_comments); if($arr_data['sort_order'] == 'desc') { $arr_comments = array_reverse($arr_comments,true); } foreach ($arr_comments as $c) { if($c['deleted_by'] == 16777215) { $c['sulogin'] = getsetting('server_name','Charlie'); } $str_out .= '
[ '.($arr_data['mode'] == 'deleted' ? 'Un' : '').'Del ]'; $str_out .= ''.date('d.m.Y H:i:s',strtotime($c['postdate'])).': '; $isSpam = $c['flags'] & COMMENTARY_SPAM; if('spam' == $arr_data['mode'] && !$isSpam) { if(strlen($c['comment']) > 250) { $c['comment'] = substr($c['comment'],0,250).'[...]'; } } // Kommentar parsen $str_comment = commentaryline($c,true); $str_out .= (substr($c['comment'],0,4) == '/msg' ? '('.$c['login'].') ' : ''); //if(2310 == $Char->acctid) { $str_out .= ($isSpam && 'spam' == $arr_data['mode'] ? 'SPAM? [ Ja! ] [ Nein! ]' : '[ Spam! ]'); //} $str_out .= ($c['su_min'] > 1 ? '(Priv.) ' : ''). $str_comment. ($arr_data['mode'] == 'deleted' ? '`nGelöscht von '.$c['sulogin'].'' : ''). '
'; } $str_out .= '`n
[ nach oben ]
'; } $str_out .= ' `^`bSeiten:`b `0'.$arr_page_res['page_nav'].''; } // Fire! output($str_out); //Usermenu starten jslib_initmenu(); popup_footer(); break; } ?>