Seite 1 von 2

report post hack - Info per PN

Verfasst: 23.06.2005 06:47
von Gumfuzi
Hallo!

Habe den Report Post Hack von Snaerder (1.1.2) und möchte aber, daß man anstelle der Email eine PN erhält.

Dann sieht man sofort die neue PN und erhält zusätzlich eine Email (aufgrund der PN).

Verfasst: 27.06.2005 23:11
von Gumfuzi
*vorsichtigbump*

Verfasst: 28.06.2005 00:05
von Budman
Weiss zwar nicht, ob Du das selbst kannst, aber hier wäre die entsprehende Funktion zum automatischen erstellen einer PN

phpbb.com Insert PM

Verfasst: 28.06.2005 12:15
von Gumfuzi
Super, danke!!!
Das werde ich heute gleich mal testen.

Verfasst: 06.11.2005 19:49
von JJacu
hallo - würde gerne das gleiche machen, aber kann mit dem link nix anfangen wäre nett

Verfasst: 06.11.2005 21:41
von Gumfuzi
Hi!

ich habe es so gemacht - soweit ich das noch nachkonstruieren kann:

in der /includes/functions_post.php habe ich folgendes eingefügt (am Ende der Datei:

Code: Alles auswählen

function insert_pm(
   $to_id, 
   $message,
   $subject,
   $from_id,
   $html_on = 0,
   $bbcode_on = 1,
   $smilies_on = 1)
{
   global $db, $lang, $user_ip, $board_config, $userdata, $phpbb_root_path, $phpEx;

   if ( !$from_id )
   {
      $from_id = $userdata['user_id'];
   }

   //get varibles ready
   $to_id = intval($to_id);
   $from_id = intval($from_id);
   $msg_time = time();
   $attach_sig = $userdata['user_attachsig'];
   
   //get to users info
   $sql = "SELECT user_id, user_notify_pm, user_email, user_lang, user_active
      FROM " . USERS_TABLE . "
      WHERE user_id = '$to_id'
         AND user_id <> " . ANONYMOUS;
   if ( !($result = $db->sql_query($sql)) )
   {
      $error = TRUE;
      $error_msg = $lang['No_such_user'];
   }

   $to_userdata = $db->sql_fetchrow($result);

   $privmsg_subject = trim(strip_tags($subject));
   if ( empty($privmsg_subject) )
   {
      $error = TRUE;
      $error_msg .= ( ( !empty($error_msg) ) ? '<br />' : '' ) . $lang['Empty_subject'];
   }

   if ( !empty($message) )
   {
      if ( !$error )
      {
         if ( $bbcode_on )
         {
            $bbcode_uid = make_bbcode_uid();
         }

#         $privmsg_message = prepare_message($message, $html_on, $bbcode_on, $smilies_on, $bbcode_uid);
#         $privmsg_message = str_replace('\\\n', '\n', $privmsg_message);
		  $privmsg_message = $message;
      }
   }
   else
   {
      $error = TRUE;
      $error_msg .= ( ( !empty($error_msg) ) ? '<br />' : '' ) . $lang['Empty_message'];
   }

   //
   // See if recipient is at their inbox limit
   //
   $sql = "SELECT COUNT(privmsgs_id) AS inbox_items, MIN(privmsgs_date) AS oldest_post_time
      FROM " . PRIVMSGS_TABLE . "
      WHERE ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
            OR privmsgs_type = " . PRIVMSGS_READ_MAIL . " 
            OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )
         AND privmsgs_to_userid = " . $to_userdata['user_id'];
   if ( !($result = $db->sql_query($sql)) )
   {
      message_die(GENERAL_MESSAGE, $lang['No_such_user']);
   }

   $sql_priority = ( SQL_LAYER == 'mysql' ) ? 'LOW_PRIORITY' : '';

   if ( $inbox_info = $db->sql_fetchrow($result) )
   {
      if ( $inbox_info['inbox_items'] >= $board_config['max_inbox_privmsgs'] )
      {
         $sql = "SELECT privmsgs_id FROM " . PRIVMSGS_TABLE . "
            WHERE ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
                  OR privmsgs_type = " . PRIVMSGS_READ_MAIL . "
                  OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . "  )
               AND privmsgs_date = " . $inbox_info['oldest_post_time'] . "
               AND privmsgs_to_userid = " . $to_userdata['user_id'];
         if ( !$result = $db->sql_query($sql) )
         {
            message_die(GENERAL_ERROR, 'Could not find oldest privmsgs (inbox)', '', __LINE__, __FILE__, $sql);
         }
         $old_privmsgs_id = $db->sql_fetchrow($result);
         $old_privmsgs_id = $old_privmsgs_id['privmsgs_id'];
            
         $sql = "DELETE $sql_priority FROM " . PRIVMSGS_TABLE . "
            WHERE privmsgs_id = $old_privmsgs_id";
         if ( !$db->sql_query($sql) )
         {
            message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs (inbox)'.$sql, '', __LINE__, __FILE__, $sql);
         }

         $sql = "DELETE $sql_priority FROM " . PRIVMSGS_TEXT_TABLE . "
            WHERE privmsgs_text_id = $old_privmsgs_id";
         if ( !$db->sql_query($sql) )
         {
            message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs text (inbox)', '', __LINE__, __FILE__, $sql);
         }
      }
   }

   $sql_info = "INSERT INTO " . PRIVMSGS_TABLE . " (privmsgs_type, privmsgs_subject, privmsgs_from_userid, privmsgs_to_userid, privmsgs_date, privmsgs_ip, privmsgs_enable_html, privmsgs_enable_bbcode, privmsgs_enable_smilies, privmsgs_attach_sig)
      VALUES (" . PRIVMSGS_NEW_MAIL . ", '" . str_replace("\'", "''", $privmsg_subject) . "', " . $from_id . ", " . $to_userdata['user_id'] . ", $msg_time, '$user_ip', $html_on, $bbcode_on, $smilies_on, $attach_sig)";

   if ( !($result = $db->sql_query($sql_info, BEGIN_TRANSACTION)) )
   {
      message_die(GENERAL_ERROR, "Could not insert/update private message sent info.", "", __LINE__, __FILE__, $sql_info);
   }

   $privmsg_sent_id = $db->sql_nextid();

   $sql = "INSERT INTO " . PRIVMSGS_TEXT_TABLE . " (privmsgs_text_id, privmsgs_bbcode_uid, privmsgs_text)
      VALUES ($privmsg_sent_id, '" . $bbcode_uid . "', '" . str_replace("\'", "''", $privmsg_message) . "')";

   if ( !$db->sql_query($sql, END_TRANSACTION) )
   {
      message_die(GENERAL_ERROR, "Could not insert/update private message sent text.", "", __LINE__, __FILE__, $sql);
   }

   //
   // Add to the users new pm counter
   //
   $sql = "UPDATE " . USERS_TABLE . "
      SET user_new_privmsg = user_new_privmsg + 1, user_last_privmsg = " . time() . " 
      WHERE user_id = " . $to_userdata['user_id'];
   if ( !$status = $db->sql_query($sql) )
   {
      message_die(GENERAL_ERROR, 'Could not update private message new/read status for user', '', __LINE__, __FILE__, $sql);
   }

   if ( $to_userdata['user_notify_pm'] && !empty($to_userdata['user_email']) && $to_userdata['user_active'] )
   {
      $script_name = preg_replace('/^\/?(.*?)\/?$/', "\\1", trim($board_config['script_path']));
      $script_name = ( $script_name != '' ) ? $script_name . '/privmsg.'.$phpEx : 'privmsg.'.$phpEx;
      $server_name = trim($board_config['server_name']);
      $server_protocol = ( $board_config['cookie_secure'] ) ? 'https://' : 'http://';
      $server_port = ( $board_config['server_port'] <> 80 ) ? ':' . trim($board_config['server_port']) . '/' : '/';

      include($phpbb_root_path . 'includes/emailer.'.$phpEx);
      $emailer = new emailer($board_config['smtp_delivery']);
               
      $emailer->from($board_config['board_email']);
      $emailer->replyto($board_config['board_email']);

      $emailer->use_template('privmsg_notify', $to_userdata['user_lang']);
      $emailer->email_address($to_userdata['user_email']);
      $emailer->set_subject($lang['Notification_subject']);
               
      $emailer->assign_vars(array(
         'USERNAME' => $to_username,
         'SITENAME' => $board_config['sitename'],
         'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',

         'U_INBOX' => $server_protocol . $server_name . $server_port . $script_name . '?folder=inbox')
      );

      $emailer->send();
      $emailer->reset();
   }

   return;
   
   $msg = $lang['Message_sent'] . '<br /><br />' . sprintf($lang['Click_return_inbox'], '<a href="' . append_sid("privmsg.$phpEx?folder=inbox") . '">', '</a> ') . '<br /><br />' . sprintf($lang['Click_return_index'], '<a href="' . append_sid("index.$phpEx") . '">', '</a>');

   message_die(GENERAL_MESSAGE, $msg);

} // insert_pm()
dann noch in der /includes/page_header.php:
FINDE:

Code: Alles auswählen

// BEGIN Report Post Hack
	if ( $userdata['user_level'] == ADMIN || (!$board_config['report_only_admin'] && $userdata['user_level'] > USER) )
	{
		$template->assign_block_vars("switch_report_list", array(
			'U_REPORT_LIST' => append_sid('report.'.$phpEx),
			'L_REPORT_LIST' => $lang['Report_list'])
		);
		if ( !defined('NO_REPORT_POPUP') && empty($userdata['no_report_popup']) && !empty($userdata['refresh_report_popup']) )
		{
			if ( !isset($rp) )
			{
				include($phpbb_root_path . 'includes/reportpost.'.$phpEx);
			}
			if ( $rp->check_report_popup($userdata) )
			{
#				$template->assign_block_vars("switch_report_popup", array(
#					'U_REPORT_POPUP' => append_sid('report.'.$phpEx.'?mode=popup'),
#					'S_WIDTH' => $board_config['report_popup_width'],
#					'S_HEIGHT' => $board_config['report_popup_height'])
#				);
(eventuell ohne die "#" in den letzten paar Zeilen)

DANACH EINFÜGEN:

Code: Alles auswählen

// sende PN bei neuem Report - Start
include($phpbb_root_path . 'includes/functions_post.'.$phpEx);
include_once($phpbb_root_path . 'includes/bbcode.'.$phpEx);
$message = "Es wurde ein Beitrag gemeldet. Klicke auf den folgenden Link um in die Reportliste zu kommen: http://www.deinedomain.de/phpBB2/report.php";
$title = "Ein Beitrag wurde gemeldet!";
$pn_user_id = $userdata['user_id'];
insert_pm($pn_user_id, $message, $title, 2695);
// sende PN bei neuem Report - Ende
(Text, Link und User_ID in der "insert_pm"-Funktion anpassen)

Das müsste alles gewesen sein - ohne Gewähr ;) vorher Backup machen!

Verfasst: 07.11.2005 14:34
von JJacu
Danke ;-). Werde es gleich mal ausprobieren.
Aber sag mal, da man ja keinen Code löscht / abändert sondern nur hinzufügt, kriegt man dann nicht sogar die eMail Meldung + PN Benarichtung (+ die damit verbundene eMail Meldung) ?
Sollte das so sein, bitte nur auf PN beschränken ;-)

Wie mache ich es wenn ich es an 2 Leute schicken möchte, nämlich an ID=2 (Admin) und ID 28 (Moderator) ?!

Verfasst: 07.11.2005 20:29
von Gumfuzi
Ohne Email funzt es mit der abgeänderten Version in der functions_post.php:

Code: Alles auswählen

# PN versenden (derzeit ohne Email)
function insert_pm(
   $to_id, 
   $message,
   $subject,
   $from_id,
   $html_on = 0,
   $bbcode_on = 1,
   $smilies_on = 1)
{
   global $db, $lang, $user_ip, $board_config, $userdata, $phpbb_root_path, $phpEx;

   if ( !$from_id )
   {
      $from_id = $userdata['user_id'];
   }

   //get varibles ready
   $to_id = intval($to_id);
   $from_id = intval($from_id);
   $msg_time = time();
   $attach_sig = $userdata['user_attachsig'];
   
   //get to users info
   $sql = "SELECT user_id, user_notify_pm, user_email, user_lang, user_active
      FROM " . USERS_TABLE . "
      WHERE user_id = '$to_id'
         AND user_id <> " . ANONYMOUS;
   if ( !($result = $db->sql_query($sql)) )
   {
      $error = TRUE;
      $error_msg = $lang['No_such_user'];
   }

   $to_userdata = $db->sql_fetchrow($result);

   $privmsg_subject = trim(strip_tags($subject));
   if ( empty($privmsg_subject) )
   {
      $error = TRUE;
      $error_msg .= ( ( !empty($error_msg) ) ? '<br />' : '' ) . $lang['Empty_subject'];
   }

   if ( !empty($message) )
   {
      if ( !$error )
      {
         if ( $bbcode_on )
         {
            $bbcode_uid = make_bbcode_uid();
         }

#         $privmsg_message = prepare_message($message, $html_on, $bbcode_on, $smilies_on, $bbcode_uid);
#         $privmsg_message = str_replace('\\\n', '\n', $privmsg_message);
		  $privmsg_message = $message;
      }
   }
   else
   {
      $error = TRUE;
      $error_msg .= ( ( !empty($error_msg) ) ? '<br />' : '' ) . $lang['Empty_message'];
   }

   //
   // See if recipient is at their inbox limit
   //
   $sql = "SELECT COUNT(privmsgs_id) AS inbox_items, MIN(privmsgs_date) AS oldest_post_time
      FROM " . PRIVMSGS_TABLE . "
      WHERE ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
            OR privmsgs_type = " . PRIVMSGS_READ_MAIL . " 
            OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )
         AND privmsgs_to_userid = " . $to_userdata['user_id'];
   if ( !($result = $db->sql_query($sql)) )
   {
      message_die(GENERAL_MESSAGE, $lang['No_such_user']);
   }

   $sql_priority = ( SQL_LAYER == 'mysql' ) ? 'LOW_PRIORITY' : '';

   if ( $inbox_info = $db->sql_fetchrow($result) )
   {
      if ( $inbox_info['inbox_items'] >= $board_config['max_inbox_privmsgs'] )
      {
         $sql = "SELECT privmsgs_id FROM " . PRIVMSGS_TABLE . "
            WHERE ( privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
                  OR privmsgs_type = " . PRIVMSGS_READ_MAIL . "
                  OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . "  )
               AND privmsgs_date = " . $inbox_info['oldest_post_time'] . "
               AND privmsgs_to_userid = " . $to_userdata['user_id'];
         if ( !$result = $db->sql_query($sql) )
         {
            message_die(GENERAL_ERROR, 'Could not find oldest privmsgs (inbox)', '', __LINE__, __FILE__, $sql);
         }
         $old_privmsgs_id = $db->sql_fetchrow($result);
         $old_privmsgs_id = $old_privmsgs_id['privmsgs_id'];
            
         $sql = "DELETE $sql_priority FROM " . PRIVMSGS_TABLE . "
            WHERE privmsgs_id = $old_privmsgs_id";
         if ( !$db->sql_query($sql) )
         {
            message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs (inbox)'.$sql, '', __LINE__, __FILE__, $sql);
         }

         $sql = "DELETE $sql_priority FROM " . PRIVMSGS_TEXT_TABLE . "
            WHERE privmsgs_text_id = $old_privmsgs_id";
         if ( !$db->sql_query($sql) )
         {
            message_die(GENERAL_ERROR, 'Could not delete oldest privmsgs text (inbox)', '', __LINE__, __FILE__, $sql);
         }
      }
   }

   $sql_info = "INSERT INTO " . PRIVMSGS_TABLE . " (privmsgs_type, privmsgs_subject, privmsgs_from_userid, privmsgs_to_userid, privmsgs_date, privmsgs_ip, privmsgs_enable_html, privmsgs_enable_bbcode, privmsgs_enable_smilies, privmsgs_attach_sig)
      VALUES (" . PRIVMSGS_NEW_MAIL . ", '" . str_replace("\'", "''", $privmsg_subject) . "', " . $from_id . ", " . $to_userdata['user_id'] . ", $msg_time, '$user_ip', $html_on, $bbcode_on, $smilies_on, $attach_sig)";

   if ( !($result = $db->sql_query($sql_info, BEGIN_TRANSACTION)) )
   {
      message_die(GENERAL_ERROR, "Could not insert/update private message sent info.", "", __LINE__, __FILE__, $sql_info);
   }

   $privmsg_sent_id = $db->sql_nextid();

   $sql = "INSERT INTO " . PRIVMSGS_TEXT_TABLE . " (privmsgs_text_id, privmsgs_bbcode_uid, privmsgs_text)
      VALUES ($privmsg_sent_id, '" . $bbcode_uid . "', '" . str_replace("\'", "''", $privmsg_message) . "')";

   if ( !$db->sql_query($sql, END_TRANSACTION) )
   {
      message_die(GENERAL_ERROR, "Could not insert/update private message sent text.", "", __LINE__, __FILE__, $sql);
   }

   //
   // Add to the users new pm counter
   //
   $sql = "UPDATE " . USERS_TABLE . "
      SET user_new_privmsg = user_new_privmsg + 1, user_last_privmsg = " . time() . " 
      WHERE user_id = " . $to_userdata['user_id'];
   if ( !$status = $db->sql_query($sql) )
   {
      message_die(GENERAL_ERROR, 'Could not update private message new/read status for user', '', __LINE__, __FILE__, $sql);
   }
/*
   if ( $to_userdata['user_notify_pm'] && !empty($to_userdata['user_email']) && $to_userdata['user_active'] )
   {
      $script_name = preg_replace('/^\/?(.*?)\/?$/', "\\1", trim($board_config['script_path']));
      $script_name = ( $script_name != '' ) ? $script_name . '/privmsg.'.$phpEx : 'privmsg.'.$phpEx;
      $server_name = trim($board_config['server_name']);
      $server_protocol = ( $board_config['cookie_secure'] ) ? 'https://' : 'http://';
      $server_port = ( $board_config['server_port'] <> 80 ) ? ':' . trim($board_config['server_port']) . '/' : '/';

      include($phpbb_root_path . 'includes/emailer.'.$phpEx);
      $emailer = new emailer($board_config['smtp_delivery']);
               
      $emailer->from($board_config['board_email']);
      $emailer->replyto($board_config['board_email']);

      $emailer->use_template('privmsg_notify', $to_userdata['user_lang']);
      $emailer->email_address($to_userdata['user_email']);
      $emailer->set_subject($lang['Notification_subject']);
               
      $emailer->assign_vars(array(
         'USERNAME' => $to_username,
         'SITENAME' => $board_config['sitename'],
         'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',

         'U_INBOX' => $server_protocol . $server_name . $server_port . $script_name . '?folder=inbox')
      );

      $emailer->send();
      $emailer->reset();
   }
*/
   return;
   
   $msg = $lang['Message_sent'] . '<br /><br />' . sprintf($lang['Click_return_inbox'], '<a href="' . append_sid("privmsg.$phpEx?folder=inbox") . '">', '</a> ') . '<br /><br />' . sprintf($lang['Click_return_index'], '<a href="' . append_sid("index.$phpEx") . '">', '</a>');

   message_die(GENERAL_MESSAGE, $msg);

} // insert_pm()
Der Code schickt jedem, der früher das Email erhalten hatte, sobald jemand einen Beitrag gemeldet hat (bevor Du die Änderung gemacht hast), eine PN.
D.h. daß jeder Report-List-Berechtigte eine PN erhält. Die anderen, die die PN später lesen, sehen ja in der Report-Übersicht, daß der Report bereits bearbeitet wurde.

P.S.: die im Code

Code: Alles auswählen

insert_pm($pn_user_id, $message, $title, 2695);
angegebene ID 2695 muss durch die ID des gewünschten PN-Absenders ersetzt werden

Verfasst: 08.11.2005 14:06
von JJacu
So nachdem ein paar Problemchen da waren hab ich die beseitigen können.

Habe jetzt die Anweißungen (page_header aus 1. beitrag, func_post aus 2. beitrag) jetzt durchgeführt. Es kam die Meldung (wenn in die index.php aufgerunfen habe) irgendwas mit "T STRING in page_header.php on line xx". An der Stelle stand ein Teil deines Codes ($message=...;) also hab ich ein # davor gesetz in der Hoffnung dass es immer noch geht - tut es auch.
Die index.php lädt wieder, nur wenn ich eine Meldung schreibe kommt eine weiße Seite (kein template wird geladen) auf dem steht

Code: Alles auswählen

Information
 
Es existiert kein Benutzer mit diesem Namen.
Die Email wird trotzdem an mich gesendet - aber es kommt keine PN an, und du meintest doch dass man nun keine eMail mehr bekommt (höchstens in der steht dass man eine PN bekommt).

Ich weiß jetzt nicht wo genau das liegt, ob er an eine ID schicken möchte die nicht existiert, oder der Absender falsch ist. Außerdem wundert es mich dass du einerseits sagst dass der jetzt eine PN an alle schickt, die die Rechte dazu haben, aber immernoch in der page_header.php angegeben wird an welche ID das ganze geschickt werden soll ?!

Hoffe kannst mir folgen ;-)

Weiß jetzt also nicht weiter, mein Ziel ist es 1 Modeator (hab nur einen) mit der ID 28 und einem Admin (ich) mit der ID eine PN zu schicken.

Vielen Dank im Vorraus , weiß das sehr zu schätzen.

Verfasst: 08.11.2005 20:45
von Gumfuzi
Hmm, ist ja schon ein Weilchen her, als ich das bei mir alles verändert habe.
Ich habe diese Funktion auch noch für andere Dinge laufen, darum ist das noch schwerer nachzuvollziehen. Ich habe den Code so bei mir drin.

Die Fehlermeldung deutet darauf hin, daß Du beim PN-Absender eine ungültige ID genommen hast. Die Empfänger-ID kann es nicht sein, denn die ID wird von der aktuellen User-ID übernommen.
Nimm am besten:

Code: Alles auswählen

insert_pm($pn_user_id, $message, $title, 2);
(ID 2 ist der Hauptadmin, den es ja geben sollte)

Bez. der Email:
Es ist so: der Report hack verschickt automatisch eine Email. Der Zusatz erzeugt eine PN (die normalerweise auch eine Email zur Folge hat). Mit dem Code vom "2. Posting" wird nur die Email für die PN unterdrückt, nicht aber die Email der Report Hacks.
Das hat den Vorteil, daß Mods, die nicht im Board online sind, eine Email erhalten und die Mods, die online sind, sehen es aufgrund der PN (müssen dann halt die Email später löschen) - der Hintergedanke ist der, daß die Mods, egal ob online oder nicht, sehen, daß ein Beitrag gemeldet wurde und solche Dinge gehören ja rasch erledigt.
Ohne dem Zusatz sah man keinen gemeldeten Beitrag im Forum selbst, ausser man verirrte sich genau zum richtigen Zeitpunkt in der Report-Liste ;)

Der in der page_header.php eingefügte Code wird nur dann aufgerufen, wenn der jeweilige User die Rechte dazu hat - siehe:

Code: Alles auswählen

   if ( $userdata['user_level'] == ADMIN || (!$board_config['report_only_admin'] && $userdata['user_level'] > USER) )
(kurz vor dem neu eigenfügtem Code)
Daher wird die PN auch nur an die User geschickt, die die Rechte haben.