post_stamp = __request_timestamp__; $this->ip_addr = get_ip(); $this->host_name = $GLOBALS['FUD_OPT_1'] & 268435456 ? _esc(get_host($this->ip_addr)) : 'NULL'; if ($this->fldr != 1) { $this->read_stamp = $this->post_stamp; } if ($GLOBALS['FUD_OPT_3'] & 32768) { $this->foff = $this->length = -1; } else { list($this->foff, $this->length) = write_pmsg_body($this->body); } $this->id = db_qid('INSERT INTO fud30_pmsg ( ouser_id, duser_id, pdest, to_list, ip_addr, host_name, post_stamp, icon, fldr, subject, attach_cnt, read_stamp, ref_msg_id, foff, length, pmsg_opt ) VALUES( '. $this->ouser_id .', '. ($this->duser_id ? $this->duser_id : $this->ouser_id) .', '. (isset($GLOBALS['recv_user_id'][0]) ? (int)$GLOBALS['recv_user_id'][0] : '0') .', '. ssn($this->to_list) .', \''. $this->ip_addr .'\', '. $this->host_name .', '. $this->post_stamp .', '. ssn($this->icon) .', '. $this->fldr .', '. _esc($this->subject) .', '. (int)$this->attach_cnt .', '. $this->read_stamp .', '. ssn($this->ref_msg_id) .', '. (int)$this->foff .', '. (int)$this->length .', '. $this->pmsg_opt .' )'); if ($GLOBALS['FUD_OPT_3'] & 32768 && $this->body) { $fid = db_qid('INSERT INTO fud30_msg_store (data) VALUES('. _esc($this->body) .')'); q('UPDATE fud30_pmsg SET length='. $fid .' WHERE id='. $this->id); } if ($this->fldr == 3 && !$track) { $this->send_pmsg(); } } function send_pmsg() { $this->pmsg_opt |= 16|32; $this->pmsg_opt &= 16|32|1|2|4; foreach($GLOBALS['recv_user_id'] as $v) { $id = db_qid('INSERT INTO fud30_pmsg ( to_list, ouser_id, ip_addr, host_name, post_stamp, icon, fldr, subject, attach_cnt, foff, length, duser_id, ref_msg_id, pmsg_opt ) VALUES ( '. ssn($this->to_list).', '. $this->ouser_id .', \''. $this->ip_addr .'\', '. $this->host_name .', '. $this->post_stamp .', '. ssn($this->icon) .', 1, '. _esc($this->subject) .', '. (int)$this->attach_cnt .', '. $this->foff .', '. $this->length .', '. $v .', '. ssn($this->ref_msg_id) .', '. $this->pmsg_opt .')'); if ($GLOBALS['FUD_OPT_3'] & 32768 && $this->body) { $fid = db_qid('INSERT INTO fud30_msg_store (data) VALUES('. _esc($this->body) .')'); q('UPDATE fud30_pmsg SET length='. $fid .' WHERE id='. $id); } $GLOBALS['send_to_array'][] = array($v, $id); $um[$v] = $id; } $c = uq('SELECT id, email FROM fud30_users WHERE id IN('. implode(',', $GLOBALS['recv_user_id']) .') AND users_opt>=64 AND '. q_bitand('users_opt', 64) .' > 0'); $from = reverse_fmt($GLOBALS['usr']->alias); $subject = reverse_fmt($this->subject); while ($r = db_rowarr($c)) { /* Do not send notifications about messages sent to self. */ if ($r[0] == $this->ouser_id) { continue; } send_pm_notification($r[1], $um[$r[0]], $subject, $from); } unset($c); } function sync() { $this->post_stamp = __request_timestamp__; $this->ip_addr = get_ip(); $this->host_name = $GLOBALS['FUD_OPT_1'] & 268435456 ? _esc(get_host($this->ip_addr)) : 'NULL'; if ($GLOBALS['FUD_OPT_3'] & 32768) { // DB_MESSAGE_STORAGE if ($fid = q_singleval('SELECT length FROM fud30_pmsg WHERE id='. $this->id .' AND foff!=-1')) { q('DELETE FROM fud30_msg_store WHERE id='. $this->length); } $this->foff = $this->length = -1; } else { list($this->foff, $this->length) = write_pmsg_body($this->body); } q('UPDATE fud30_pmsg SET to_list='. ssn($this->to_list) .', icon='. ssn($this->icon) .', ouser_id='. $this->ouser_id .', duser_id='. $this->ouser_id .', post_stamp='. $this->post_stamp .', subject='. _esc($this->subject) .', ip_addr=\''. $this->ip_addr .'\', host_name='. $this->host_name .', attach_cnt='. (int)$this->attach_cnt .', fldr='. $this->fldr .', foff='. (int)$this->foff .', length='. (int)$this->length .', pmsg_opt='. $this->pmsg_opt .' WHERE id='. $this->id); if ($GLOBALS['FUD_OPT_3'] & 32768 && $this->body) { $fid = db_qid('INSERT INTO fud30_msg_store (data) VALUES('. _esc($this->body) .')'); q('UPDATE fud30_pmsg SET length='. $fid .' WHERE id='. $this->id); } if ($this->fldr == 3) { $this->send_pmsg(); } } } function write_pmsg_body($text) { if (($ll = !db_locked())) { db_lock('fud30_fl_pm WRITE'); } $fp = fopen($GLOBALS['MSG_STORE_DIR'] .'private', 'ab'); if (!$fp) { exit("FATAL ERROR: cannot open private message store
\n"); } fseek($fp, 0, SEEK_END); if (!($s = ftell($fp))) { $s = __ffilesize($fp); } if (($len = fwrite($fp, $text)) !== strlen($text)) { exit("FATAL ERROR: system has ran out of disk space
\n"); } fclose($fp); if ($ll) { db_unlock(); } if (!$s) { @chmod($GLOBALS['MSG_STORE_DIR'] .'private', ($GLOBALS['FUD_OPT_2'] & 8388608 ? 0600 : 0644)); } return array($s, $len); } function read_pmsg_body($offset, $length) { if ($length < 1) { return; } if ($GLOBALS['FUD_OPT_3'] & 32768 && $offset == -1) { return q_singleval('SELECT data FROM fud30_msg_store WHERE id='. $length); } $fp = fopen($GLOBALS['MSG_STORE_DIR'].'private', 'rb'); fseek($fp, $offset, SEEK_SET); $str = fread($fp, $length); fclose($fp); return $str; } function pmsg_move($mid, $fid, $validate) { if (!$validate && !q_singleval('SELECT id FROM fud30_pmsg WHERE duser_id='. _uid .' AND id='. $mid)) { return; } q('UPDATE fud30_pmsg SET fldr='. $fid .' WHERE duser_id='. _uid .' AND id='. $mid); } function pmsg_del($mid, $fldr=0) { if (!$fldr && !($fldr = q_singleval('SELECT fldr FROM fud30_pmsg WHERE duser_id='. _uid .' AND id='. $mid))) { return; } if ($fldr != 5) { pmsg_move($mid, 5, 0); } else { if ($GLOBALS['FUD_OPT_3'] & 32768 && ($fid = q_singleval('SELECT length FROM fud30_pmsg WHERE id='. $mid .' AND foff=-1'))) { q('DELETE FROM fud30_msg_store WHERE id='. $fid); } q('DELETE FROM fud30_pmsg WHERE id='.$mid); $c = uq('SELECT id FROM fud30_attach WHERE message_id='. $mid .' AND attach_opt=1'); while ($r = db_rowarr($c)) { @unlink($GLOBALS['FILE_STORE'] . $r[0] .'.atch'); } unset($c); q('DELETE FROM fud30_attach WHERE message_id='. $mid .' AND attach_opt=1'); } } function send_pm_notification($email, $pid, $subject, $from) { send_email($GLOBALS['NOTIFY_FROM'], $email, '['.$GLOBALS['FORUM_TITLE'].'] New Private Message Notification', 'You have a new private message titled "'.$subject.'", from "'.$from.'", in the forum "'.$GLOBALS['FORUM_TITLE'].'".\nTo view the message, click here: [[softurl]]/index.php?t=pmsg_view&id='.$pid.'\n\nTo stop future notifications, disable "Private Message Notification" in your profile.'); } ?>