TP-Docs
HTML5 Icon HTML5 Icon HTML5 Icon
TP on Social Media

Recent

Welcome to TinyPortal. Please login or sign up.

Members
  • Total Members: 3,966
  • Latest: safir45
Stats
  • Total Posts: 195,985
  • Total Topics: 21,321
  • Online today: 781
  • Online ever: 8,223 (February 19, 2025, 04:35:35 AM)
Users Online
  • Users: 0
  • Guests: 429
  • Total: 429

Shoutbox

Started by tapirul, October 26, 2006, 05:46:41 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

tapirul

I am using mbirth's SMF Shoutbox  on my forum and I simply added the code
  if (function_exists('sbox')) sbox();
in a php center block, to show the shoutbox on the front page - works great.

You can add the code in TPortal.template.php as well.

seaofsin

Since you are using this shoutbox you can try this if you want.Ã,  It will work on the latest versions but I can't say that it will work on future versions

sboxDB.php in Sources Replace with

<?php
header
('Pragma: no-cache');
header('Expires: 0');
header('Cache-control: none');

require(
"../SSI.php");

if (!
defined('SMF'))
Ã,  die('Hacking attempt...');
is_not_banned(true);

loadLanguage('sbox');

/***[ BEGIN CONFIGURATION ]***************************************************/

$sbox_HistoryFile $boarddir '/sbox.history.html';

$sbox_NickPrefix '&lt;';Ã,  Ã,  Ã,   // this won't be linked to the profile page
$sbox_NickInnerPrefix '<b>';Ã,   // this will be linked to the profile page, use formatting tags (<B>) here
$sbox_NickInnerSuffix '</b>';Ã,  // so that they are applied inside the <A>, otherwise they won't work
$sbox_NickSuffix '&gt;';

$sbox_DatePrefix '[';
$sbox_DateSeparator '&nbsp;';Ã,  Ã,  // separates weekday from time
$sbox_DateSuffix ']';

/***[ END CONFIGURATION ]*****************************************************/

// BEGIN: BORROWED FROM http://de2.php.net/manual/en/function.flock.php
/*
 * I hope this is usefull. 
 * If mkdir() is atomic, 
 * then we do not need to worry about race conditions while trying to make the lockDir,
 * unless of course we're writing to NFS, for which this function will be useless.
 * so thats why i pulled out the usleep(rand()) piece from the last version
 *
 * Again, its important to tailor some of the parameters to ones indivdual usage
 * I set the default $timeLimit to 3/10th's of a second (maximum time allowed to achieve a lock), 
 * but if you're writing some extrememly large files, and/or your server is very slow, you may need to increase it.
 * Obviously, the $staleAge of the lock directory will be important to consider as well if the writing operations might take a while.
 * My defaults are extrememly general and you're encouraged to set your own
 *
 * $timeLimit is in microseconds
 * $staleAge is in seconds
 */

function microtime_float() {
Ã,   list($usec$sec) = explode(' 'microtime());
Ã,   return ((float)$usec + (float)$sec);
}

function 
locked_filewrite($filename$data$timeLimit 300000$staleAge 5) {
Ã,   ignore_user_abort(1);
Ã,   $lockDir $filename '.lock';

Ã,   if (is_dir($lockDir)) {
Ã,  Ã,   if ((time() - filemtime($lockDir)) > $staleAge) {
Ã,  Ã,  Ã,   rmdir($lockDir);
Ã,  Ã,   }
Ã,   }

Ã,   $locked = @mkdir($lockDir);

Ã,   if ($locked === false) {
Ã,  Ã,   $timeStart microtime_float();
Ã,  Ã,   do {
Ã,  Ã,  Ã,   if ((microtime_float() - $timeStart) > $timeLimit) break;
Ã,  Ã,  Ã,   $locked = @mkdir($lockDir);
Ã,  Ã,   } while ($locked === false);
Ã,   }

Ã,   $success false;

Ã,   if ($locked === true) {
Ã,  Ã,   $fp = @fopen($filename'at');
Ã,  Ã,   if (@fwrite($fp$data)) $success true;
Ã,  Ã,   @fclose($fp);
Ã,  Ã,   rmdir($lockDir);
Ã,   }

Ã,   ignore_user_abort(0);
Ã,   return $success;
}
// END: BORROWED FROM http://de2.php.net/manual/en/function.flock.php

function missinghtmlentities($text) {
Ã,  // entitify missing characters, ignore entities already there (Unicode / UTF8) (hopefully in {-notation)
Ã,  $split preg_split('/(&#[\d]+;)/'$text, -1PREG_SPLIT_DELIM_CAPTURE);
Ã,  $result '';
Ã,  foreach ($split as $s) {
Ã,  Ã,  if (substr($s02) != '&#' || substr($s, -11) != ';') {
Ã,  Ã,  Ã,  
Ã
,  Ã,  Ã,  $result .= $s;
Ã,  Ã,  }
Ã,  }
Ã,  return $result;
}

//display html header
echo '<html xmlns="http://www.w3.org/1999/xhtml"' . ($context['right_to_left']?' dir="rtl"':'') . '>
<head>
Ã,  <meta http-equiv="Content-Type" content="text/html; charset='
$context['character_set'], '" />';
Ã,  
$result 
db_query("SELECT value2 FROM {$db_prefix}tp_variables WHERE type = 'shoutbox' ORDER BY value2 DESC LIMIT 1"__FILE____LINE__);
$row mysql_fetch_assoc($result);
$refreshBlocked false;
$delta time() - $row['value2'];
if ((!empty(
$_REQUEST['action'])) && ($_REQUEST['action'] == 'write')) $dontblock true; else $dontblock false;
if ((
$delta $modSettings['lastActive']*60) && ($modSettings['sbox_BlockRefresh'] == '1') && (!$dontblock)) {
Ã,  $refreshBlocked true;
} else {
Ã,  echo '
Ã,  <meta http-equiv="refresh" content="' 
$modSettings['sbox_RefreshTime'] . ';URL=sboxDB.php?ts=' time() . '">';
}

$sbox_CurTheme strtolower(substr($settings['theme_url'], strrpos($settings['theme_url'], '/')+1));
$sbox_DarkThemes explode('|'strtolower($modSettings['sbox_DarkThemes']));
if (
in_array($sbox_CurTheme$sbox_DarkThemes)) {
Ã,  $sbox_TextColor2 $modSettings['sbox_TextColor2'];
} else {
Ã,  $sbox_TextColor2 $modSettings['sbox_TextColor1'];
}

echo 
'
Ã,  <link rel="stylesheet" type="text/css" href="' 
$settings['theme_url'] . '/style.css?rc2" />
Ã,  <script language="JavaScript" type="text/javascript"><!-- // --><![CDATA[
Ã,  Ã,  function kill() { return confirm("' 
$txt['sbox_KillShout'] . '"); }
Ã,  Ã,  function clearHist() { return confirm("' 
$txt['quickmod_confirm'] . '"); }

Ã,  Ã,  // get SMF-time including time zone corrections (system+user)
Ã,  Ã,  if (parent && parent.document.sbox.ts) {
Ã,  Ã,  Ã,  parent.document.sbox.ts.value = ' 
forum_time(true) . ';
Ã,  Ã,  }
Ã,  Ã,  // ]]></script>
Ã,  <style type="text/css">
Ã,  
Ã,  Ã,  .windowbg2 {
Ã,  Ã,  Ã,  font-family: ' 
$modSettings['sbox_FontFamily'] . ';
Ã,  Ã,  Ã,  font-style: normal;
Ã,  Ã,  Ã,  font-size: ' 
$modSettings['sbox_TextSize'] . ';
Ã,  Ã,  Ã,  font-weight: normal;
Ã,  Ã,  Ã,  text-decoration: none;
Ã,  Ã,  }

Ã,  Ã,  .Even {
Ã,  Ã,  Ã,  color: ' 
$sbox_TextColor2 ';
Ã,  Ã,  Ã,  font-weight: normal;
Ã,  Ã,  Ã,  text-decoration: none;
Ã,  Ã,  }
Ã,  Ã,  
Ã,  Ã,  body {
Ã,  Ã,  Ã,  width: 100%;
Ã,  Ã,  Ã,  padding: 0;
Ã,  Ã,  Ã,  margin: 0;
Ã,  Ã,  Ã,  border: 0;
Ã,  Ã,  }
 
Ã,  Ã,  .Kill, A.Kill {
Ã,  Ã,  Ã,  color: #ff0000;
Ã,  Ã,  }
Ã,  </style>'
;


if (!empty(
$_REQUEST['action'])) switch ($_REQUEST['action']) {
 
Ã,  case 'write':
Ã,  Ã,  ifÃ,  (((!$context['user']['is_guest']) || ($modSettings['sbox_GuestAllowed'] == '1')) && !empty($_REQUEST['sboxText'])) {
Ã,  Ã,  Ã,  $content $_REQUEST['sboxText'];
Ã,  Ã,  Ã,  // get current timestamp
Ã,  Ã,  Ã,  $date time();
Ã,  Ã,  
Ã
,  Ã,  Ã,  $posterip $user_info['ip'];
Ã,  Ã,  Ã,  $pip explode('.'$posterip);
Ã,  Ã,  Ã,  $piph sprintf("%02s%02s%02s%02s"dechex($pip[0]), dechex($pip[1]), dechex($pip[2]), dechex($pip[3]));
Ã,  Ã,  
Ã
,  Ã,  Ã,  // handle special characters
//Ã,  Ã,  Ã,  $content = addslashes($piph . $content);
Ã,  Ã,  
Ã
,  Ã,  Ã,  // insert shout message into database
Ã,  Ã,  Ã,  $sql "INSERT INTO " $db_prefix "tp_variables (value5, value1, value2, type) VALUES ('" $context['user']['id'] . "', '" $content "', '$date', 'shoutbox')";
Ã,  Ã,  Ã,  db_query($sql__FILE____LINE__);
Ã,  Ã,  
Ã
,  Ã,  Ã,  // delete old shout messages (get id of last shouting and delete all shoutings as defined in settings
Ã,  Ã,  Ã,  $result db_query("SELECT id FROM " $db_prefix "tp_variables WHERE value5 ='" $context['user']['id'] . "' AND value1='" $content "' AND value2='$date' AND type = 'shoutbox'"__FILE____LINE__);
Ã,  Ã,  Ã,  $rows mysql_fetch_assoc($result);
Ã,  Ã,  Ã,  $sql 'DELETE FROM ' $db_prefix "tp_variables WHERE id < '" . ($rows["id"]-$modSettings['sbox_MaxLines']) . "' AND type = 'shoutbox'";
Ã,  Ã,  Ã,  db_query($sql__FILE____LINE__);
Ã,  Ã,  Ã,  
Ã
,  Ã,  Ã,  // write into history if needed
Ã,  Ã,  Ã,  if ($modSettings['sbox_DoHistory'] == '1') {
Ã,  Ã,  Ã,  Ã,  $ds $sbox_DatePrefix date('Y-m-d'$date) . $sbox_DateSeparator date('H:i.s'$date) . $sbox_DateSuffix;
Ã,  Ã,  Ã,  Ã,  
Ã
,  Ã,  Ã,  Ã,  $content stripslashes($content); // shouting content
//Ã,  Ã,  Ã,  Ã,  $content = substr($content, 8);
Ã,  Ã,  Ã,  Ã,  $content missinghtmlentities($content);
Ã,  Ã,  Ã,  Ã,  if ($modSettings['sbox_AllowBBC'] == '1' && ($context['user']['id'] > || $modSettings['sbox_GuestBBC'] == '1')) {
Ã,  Ã,  Ã,  Ã,  Ã,  $content parse_bbc($content);
Ã,  Ã,  Ã,  Ã,  }
Ã,  Ã,  Ã,  Ã,  
Ã
,  Ã,  Ã,  Ã,  $output $ds '&nbsp;' $sbox_NickPrefix;
Ã,  Ã,  Ã,  Ã,  if ($context['user']['id'] > 0) {
Ã,  Ã,  Ã,  Ã,  Ã,  $output .= '<a href="' $scripturl '?action=profile;u=' $context['user']['id'] . '" target="_blank" class="' $divclass '">';
Ã,  Ã,  Ã,  Ã,  Ã,  $output .= $sbox_NickInnerPrefix . ((!empty($context['user']['name']))?$context['user']['name']:$context['user']['username']) . $sbox_NickInnerSuffix;
Ã,  Ã,  Ã,  Ã,  Ã,  $output .= '</a>';
Ã,  Ã,  Ã,  Ã,  } else {
Ã,  Ã,  Ã,  Ã,  Ã,  $output .= $sbox_NickInnerPrefix 'Guest-' base_convert($piph1636) . $sbox_NickInnerSuffix;
Ã,  Ã,  Ã,  Ã,  }
Ã,  Ã,  Ã,  Ã,  $output .= $sbox_NickSuffix '&nbsp;' $content '</div><br />' "\n";
Ã,  Ã,  Ã,  Ã,  
Ã
,  Ã,  Ã,  Ã,  if (!file_exists($sbox_HistoryFile)) {
Ã,  Ã,  Ã,  Ã,  Ã,  // TODO: Prepare file ... HTML-header, stylesheet, etc.
Ã,  Ã,  Ã,  Ã,  }
Ã,  Ã,  Ã,  Ã,  
Ã
,  Ã,  Ã,  Ã,  locked_filewrite($sbox_HistoryFile$output);
Ã,  Ã,  Ã,  }
Ã,  Ã,  }
Ã,  Ã,  break;
Ã,   
Ã
,  case 'clearhist':
Ã,  Ã,  if ($context['user']['is_admin']) {
Ã,  Ã,  Ã,  if (file_exists($sbox_HistoryFile)) {
Ã,  Ã,  Ã,  Ã,  $lockDir $sbox_HistoryFile '.lock';
Ã,  Ã,  Ã,  Ã,  $start time();
Ã,  Ã,  Ã,  Ã,  while ((is_dir($lockDir)) && ((time() - $start) < 5)) {
Ã,  Ã,  Ã,  Ã,  Ã,  usleep(100000);Ã,  // sleep 1/10th of a second (for a PC these are ages!)
Ã,  Ã,  Ã,  Ã,  }
Ã,  Ã,  Ã,  Ã,  if (!is_dir($lockDir)) @unlink($sbox_HistoryFile);
Ã,  Ã,  Ã,  }
Ã,  Ã,  }
Ã,  Ã,  break;

Ã,  case 'kill':
Ã,  Ã,  ifÃ,  (!empty($_REQUEST['kill']) && ($context['user']['is_admin'] || ($modSettings['sbox_ModsRule'] && count(boardsAllowedTo('moderate_board'))>0))) {
$sql 'DELETE FROM ' $db_prefix 'tp_variables WHERE type = "shoutbox" AND id=' intval($_REQUEST['kill']);
Ã,  Ã,  Ã,  db_query($sql__FILE____LINE__);
Ã,  Ã,  }
Ã,  Ã,  break;
Ã,  Ã,  
}

// close header and open body
echo '
</head>
<body class="windowbg2"><div class="windowbg2">'
;

echo 
"\n" '<b>' $sbox_DatePrefix strftime($user_info['time_format'], forum_time(true)) . $sbox_DateSuffix;
if (
$refreshBlocked) {
Ã,  echo ' ' $txt['sbox_RefreshBlocked'];
}
echo 
'</b><br />';

if (
$context['user']['is_admin']) {
Ã,  if ($modSettings['sbox_DoHistory'] == '1') {
Ã,  Ã,  echo "\n";
Ã,  Ã,  if (file_exists($sbox_HistoryFile)) {
Ã,  Ã,  Ã,  echo '[<a href="' str_replace($boarddir$boardurl$sbox_HistoryFile) . '" target="_blank">' $txt['sbox_History'] . '</a>]';
Ã,  Ã,  Ã,  echo ' [<a href="' $_SERVER['PHP_SELF'] . '?action=clearhist" class="Kill" onClick="return clearHist();">' $txt['sbox_HistoryClear'] . '</a>]';
Ã,  Ã,  } else {
Ã,  Ã,  Ã,  echo '[' $txt['sbox_HistoryNotFound'] . ']';
Ã,  Ã,  }
Ã,  Ã,  echo '';
Ã,  }
}

/*
if (!empty($settings['display_who_viewing'])) {
Ã,  echo '<small>';
Ã,  if ($settings['display_who_viewing'] == 1)
Ã,  Ã,  echo count($context['view_members']), ' ', count($context['view_members']) == 1 ? $txt['who_member'] : $txt[19];
Ã,  else
Ã,  Ã,  echo empty($context['view_members_list']) ? '0 ' . $txt[19] : implode(', ', $context['view_members_list']) . ((empty($context['view_num_hidden']) or $context['can_moderate_forum']) ? '' : ' (+ ' . $context['view_num_hidden'] . ' ' . $txt['hidden'] . ')');
Ã,  echo $txt['who_and'], $context['view_num_guests'], ' ', $context['view_num_guests'] == 1 ? $txt['guest'] : $txt['guests'], $txt['who_viewing_board'], '</small>';
}
*/

// get shout messages out of database
$result db_query("
Ã,  SELECT *
Ã,  FROM 
{$db_prefix}tp_variables AS sb, {$db_prefix}members AS mem 
Ã,  WHERE mem.ID_MEMBER = sb.value5 AND sb.type = 'shoutbox' ORDER BY id DESC, value2 ASC LIMIT " 
$modSettings['sbox_MaxLines'], __FILE____LINE__);

if(
mysql_num_rows($result)) {
Ã,  $lname '';
Ã,  $count 0;
Ã,  $div false;
Ã,  $alert false;
Ã,  while($row mysql_fetch_assoc($result)) {
Ã,  Ã,  $name $row['value5'];Ã,  Ã,  Ã,  Ã,  Ã,   // user name
Ã,  Ã,  $date forum_time(true$row['value2']);Ã,  Ã,  Ã,  Ã,  Ã,   // shouting date and time
Ã,  Ã,  $content stripslashes($row['value1']); // shouting content
//Ã,  Ã,  $piph = substr($content, 0, 8);
//Ã,  Ã,  $content = substr($content, 8);
Ã,  Ã,  censorText($content);
Ã,  Ã,  $content missinghtmlentities($content);
Ã,  Ã,  if ($modSettings['sbox_AllowBBC'] == '1' && ($name || $modSettings['sbox_GuestBBC'] == '1')) {
Ã,  Ã,  Ã,  $content parse_bbc($content);
Ã,  Ã,  }

Ã,  Ã,  if (!empty($_REQUEST['ts']) && !$div && $date<$_REQUEST['ts']) {
Ã,  Ã,  Ã,  if ($count && $modSettings['sbox_NewShoutsBar'] == '1') {
Ã,  Ã,  Ã,  Ã,  echo '<hr>' "\n";
Ã,  Ã,  Ã,  }
Ã,  Ã,  Ã,  $div true;
Ã,  Ã,  }
Ã,  Ã,  
Ã
,  Ã,  if ($name != $lname) {
Ã,  Ã,  Ã,  $count++;Ã,  Ã,  Ã,  Ã,  Ã,   // increase counter
Ã,  Ã,  }
Ã,  Ã,  $lname $name;

Ã,  Ã,  // display shouting message and use a different color each second row
Ã,  Ã,  if ($count == 0) {
Ã,  Ã,  Ã,  $divclass 'windowbg2';
Ã,  Ã,  } else {
Ã,  Ã,  Ã,  $divclass 'Even';
Ã,  Ã,  }

/*Ã,  Ã,  $r = $g = $b = 0;
Ã,  Ã,  for ($i=0;$i<strlen($name);$i++) {
Ã,  Ã,  Ã,  $x = ord(substr($name, $i, 1));
Ã,  Ã,  Ã,  switch ($i % 3) {
Ã,  Ã,  Ã,  Ã,  case 0: $r += $x; break;
Ã,  Ã,  Ã,  Ã,  case 1: $g += $x; break;
Ã,  Ã,  Ã,  Ã,  case 2: $b += $x; break;
Ã,  Ã,  Ã,  }
Ã,  Ã,  }
Ã,  Ã,  $r = dechex($r % 192);
Ã,  Ã,  $g = dechex($g % 192);
Ã,  Ã,  $b = dechex($b % 192);
Ã,  Ã,  if (strlen($r)<2) $r = '0' . $r;
Ã,  Ã,  if (strlen($g)<2) $g = '0' . $g;
Ã,  Ã,  if (strlen($b)<2) $b = '0' . $b;
Ã,  Ã,  $colh = $r . $g . $b;

Ã,  Ã,  echo "\n" . '<div class="' . $divclass . '" style="color: #' . $colh . '">'; */
Ã,  Ã,  echo "\n" '<div class="' $divclass '">';
Ã,  Ã,  
Ã
,  Ã,  if ($context['user']['is_admin'] || ($modSettings['sbox_ModsRule'] && count(boardsAllowedTo('moderate_board'))>0)) {
Ã,  Ã,  Ã,  echo '[<a title="' $txt['sbox_KillShout'] . '" class="Kill" onClick="return kill();" href="' $_SERVER['PHP_SELF'] . '?action=kill&kill=' $row['id'] . '">X</a>]';
Ã,  Ã,  }
Ã,  Ã,  
Ã
,  Ã,  $wd $txt['days_short'][date('w'$date)];
Ã,  Ã,  $ts date('H:i'$date);
Ã,  Ã,  $ds $sbox_DatePrefix $wd $sbox_DateSeparator $ts $sbox_DateSuffix;
Ã,  Ã,  
Ã
,  Ã,  // highlight username, realname and make sound
Ã,  Ã,  if (!empty($context['user']['name']) && strpos($content$context['user']['name']) !== false) {
Ã,  Ã,  Ã,  if ($div === false$alert true;
Ã,  Ã,  Ã,  $content str_replace($context['user']['name'], '<b><u>' $context['user']['name'] . '</u></b>'$content);
Ã,  Ã,  }
Ã,  Ã,  if (!empty($user_info['username']) && $user_info['username'] != $context['user']['name'] && strpos($content$user_info['username']) !== false) {
Ã,  Ã,  Ã,  if ($div === false$alert true;
Ã,  Ã,  Ã,  $content str_replace($user_info['username'], '<b><u>' $user_info['username'] . '</u></b>'$content);
Ã,  Ã,  }
Ã,  Ã,  
Ã
,  Ã,  echo $ds '&nbsp;' $sbox_NickPrefix;
Ã,  Ã,  if ($name 0) {
Ã,  Ã,  Ã,  if ($modSettings['sbox_UserLinksVisible'] == '1') echo '<a href="' $scripturl '?action=profile;u=' $name '" target="_top" style="text-decoration: none;"><span class="' $divclass '">';
Ã,  Ã,  Ã,  echo $sbox_NickInnerPrefix . ((!empty($row['realName']))?$row['realName']:$row['memberName']) . $sbox_NickInnerSuffix;
Ã,  Ã,  Ã,  if ($modSettings['sbox_UserLinksVisible'] == '1') echo '</span></a>';
Ã,  Ã,  } else {
Ã,  Ã,  Ã,  echo $sbox_NickInnerPrefix $txt['sbox_Guest'] . '-' base_convert($piph1636) . $sbox_NickInnerSuffix;
Ã,  Ã,  }
Ã,  Ã,  echo $sbox_NickSuffix '&nbsp;' $content '</div>';
Ã,  }
Ã,  if (($modSettings['sbox_EnableSounds']) && ($alert === true) && ($div === true)) {
Ã,  Ã,  echo '<embed src="' $boardurl '/chat-inbound_GSM.wav" hidden="true" autostart="true" loop="false"></embed>' "\n";
Ã,  }
}

?>

</div>
</body>
</html>


This will put shouts in tp_variables so you can view them in your profile.

Feel free to modify it, but let me have a copy as well!! :)

This website is proudly hosted on Crocweb Cloud Website Hosting.