DatabaseFunctions.php
<?php /**
- MediaWiki WikiChat extension
- See: http://www.mediawiki.org/wiki/Extension:Chat for installation
- Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
- Author: http://www.wikichat.org/User:Firebreather
- /
- set to the directory phpfreechat is installed in
define('WC_PFC_DIRECTORY', 'phpfreechat');
- set to false to deny access to anonymous users
define('WC_ALLOW_ANONYMOUS_USERS', true);
- message shown when denying anonymous users. Change if you want a
- different message. WikiText ok..
define('WC_DENY_ACCESS_MESSAGE', 'You must login to be allowed into this chatroom');
- when true there will be a chat room per article. Set to false to have
- a single site-wide chat room.
define('WC_ROOM_PER_ARTICLE', true);
if (!defined('MEDIAWIKI')) die ('Not an entry point');
$wgPFC_Directory = WC_PFC_DIRECTORY;
require_once "$IP/$wgPFC_Directory/src/phpfreechat.class.php"; require_once "$IP/extensions/WikiChat/DatabaseFunctions.php";
$wgRoomPerArticle = WC_ROOM_PER_ARTICLE; $wgAllowAnonUsers = WC_ALLOW_ANONYMOUS_USERS; $wgDenyAccessMessage = WC_DENY_ACCESS_MESSAGE; // This is the maximum nickname length. $wgChatMaxNickLen = 30; // This is the maximum message length in characters. $wgChatMaxTextLen = 480; // The maximum number of allowed channels for each user. $wgChatMaxChannels = 6; // This is the maximum number of private message allowed // at the same time for one user. $wgChatMaxPrivMsg = 3; // This is the time to wait between two refreshes, in msecs. $wgChatRefreshDelay = 2000; // This is the number of messages kept in the history. $wgChatMaxMsg = 600; // The maximum number of lines displayed in the window. $wgChatMaxDisplayedLines = 600; // Height of the chat area. $wgChatHeight = "230px"; // msecs until user is disconnected $wgChatTimeout = 600000; // Usernames of those with admin (i.e. chat moderator) rights $wgChatAdmins = array(); // User groups with chat moderator rights $wgChatAdminGroups = array( 'sysop' );
/* Extension variables */ $wgExtensionFunctions[] = 'wfSetupWikiChat'; $wgExtensionCredits['other'][] = array(
'name' => 'WikiChat', 'version' => '0.3.9, 2012-08-30, 1.19', 'author' => '[http://www.wikichat.org/User:Firebreather '.
'User:Firebreather]',
'url' => 'http://www.wikichat.org/', 'description' => 'Adds a tab to each article that switches to a
chatroom', );
class WikiChat {
// Constructor public function WikiChat() { global $wgHooks; # Add all our needed hooks $wgHooks['UnknownAction'][] = $this; $wgHooks['SkinTemplateTabs'][] = $this; // Vector support $wgHooks['SkinTemplateNavigation'][] = $this; } // main entry point public function onUnknownAction($action, $article) { global $wgOut, $wgCachePages, $wgTitle, $wgDBprefix,
$wgDenyAccessMessage;
$wgCachePages = false; if($action == 'chat') { $wgOut->setPageTitle(str_replace('_', ' ',
$wgTitle->getPrefixedText()));
if($this->isAnonDenied()) {
$wgOut->addWikiText($wgDenyAccessMessage);
return false; } $params = $this->configurePFC_Params(); $tblname = $wgDBprefix."chathistory"; $this->createChatHistoryDBTable($tblname); $this->configurePFC_DB_Params($tblname,
$params);
$this->configureNick($params); $this->showChat($params); return false; } else { return true; } } private function isAnonDenied() { global $wgUser, $wgAllowAnonUsers; return !$wgAllowAnonUsers && $wgUser->isAnon(); } private function configureNick(&$params) { global $wgUser, $wgOut, $wgAllowAnonUsers,
$wgDenyAccessMessage, $wgTitle;
$nick = ""; if($wgUser->isAnon()) { } else { $nick = $wgUser->getName(); } $params["nick"] = $nick; // setup the initial nickname return $nick; } private function configurePFC_Params() { global $wgTitle, $wgRoomPerArticle, $wgPFC_Directory; global $wgOut; global $wgChatMaxNickLen, $wgChatMaxTextLen, $wgChatMaxChannels, $wgChatMaxPrivMsg, $wgChatRefreshDelay, $wgChatMaxMsg, $wgChatMaxDisplayedLines, $wgChatHeight, $wgChatTimeout, $wgChatAdmins, $wgChatAdminGroups, $wgDBprefix; // Assign all members of the chat admin groups to be chat admins $userTable = $wgDBprefix . 'user'; $userGroupsTable = $wgDBprefix . 'user_groups'; if ( !empty ( $wgChatAdminGroups ) ) { $sql = "SELECT user_name FROM `$userTable` JOIN $userGroupsTable ON $userGroupsTable.ug_user = $userTable.user_id WHERE ( "; $isFirstOne = true; foreach ( $wgChatAdminGroups as $thisGroup ) { if ( $isFirstOne == false ) { $sql .= " OR "; } $isFirstOne = false; $sql .= "$userGroupsTable.ug_group = '". "$thisGroup'"; } $sql .= " )"; $dbr =& wfGetDB( DB_SLAVE ); $res = $dbr->query ( $sql ); $numRows = $dbr->numRows ( $res ); for ( $i = 1; $i <= $numRows; $i++ ) { $row = $dbr->fetchRow( $res ); $wgChatAdmins[] = $row['user_name']; } } $params["title"] = "WikiChat"; // apply room per page or site-wide room configuration option if($wgRoomPerArticle) { //replace slashes in the page db key to ensure // chat works for subpages $params["serverid"] = str_replace('/',
'##', $wgTitle->getPrefixedText());
} else { $params["serverid"] = md5(__FILE__); } $params["data_public_url"] =
"$wgPFC_Directory/data/public";
$params["data_public_path"] =
"$wgPFC_Directory/data/public";
$params["server_script_url"] = $_SERVER['REQUEST_URI']; $params["openlinknewwindow"] = true; $params["channels"] = array(str_replace('_', ' ',
$wgTitle->getPrefixedText()));
$params["frozen_nick"] = true; /* do not allow to change the nickname */ $params["shownotice"] = 0; /* 0 = nothing, 1
= just nickname changes, 2 = connect/quit, 3 = nick + connect */
$params["max_nick_len"] = $wgChatMaxNickLen; $params["max_text_len"] = $wgChatMaxTextLen; $params["max_channels"] = $wgChatMaxChannels; $params["max_privmsg"] = $wgChatMaxPrivMsg; $params["refresh_delay"] = $wgChatRefreshDelay; $params["max_msg"] = $wgChatMaxMsg; $params["max_displayed_lines"] = $wgChatMaxDisplayedLines; $params["height"] = $wgChatHeight; $params["debug"] = false; $params["timeout"] = $wgChatTimeout; $params["admins"] = $wgChatAdmins; return $params; } private function createChatHistoryDBTable($tblname) { $dbr =& wfGetDB( DB_SLAVE ); $sql = "show tables like '$tblname'"; $res = $dbr->query ( $sql ) ; $num_rows = $dbr->numRows($res) + 0; $dbr->freeResult( $res ); //create the chathistory table if it doesn't exist if($num_rows == 0) { $sql = "CREATE TABLE IF NOT EXISTS `$tblname` ( `server` varchar(32) NOT NULL default , `group` varchar(64) NOT NULL default , `subgroup` varchar(64) NOT NULL default , `leaf` varchar(64) NOT NULL default , `leafvalue` text NOT NULL, `timestamp` int(11) NOT NULL default 0, PRIMARY KEY
(`server`,`group`,`subgroup`,`leaf`),
INDEX
(`server`,`group`,`subgroup`,`timestamp`)
) ENGINE=InnoDB;"; $ret = wfQuery($sql, DB_WRITE, ""); } } private function configurePFC_DB_Params($tblname, &$params) { global $wgDBserver, $wgDBname, $wgDBprefix, $wgDBuser,
$wgDBpassword;
$params["container_type"] = "mysql"; $params["container_cfg_mysql_host"] = $wgDBserver; $params["container_cfg_mysql_database"] = $wgDBname; $params["container_cfg_mysql_port"] = 3306; $params["container_cfg_mysql_table"] = $tblname; $params["container_cfg_mysql_username"] = $wgDBuser; $params["container_cfg_mysql_password"] = $wgDBpassword; } private function showChat($params) { global $wgOut; $pfc = new phpFreeChat($params); $wgOut->addHTML($pfc->printChat(true));
$wgOut->addHTML('
Type /help for a list of all commands
');
$wgOut->addWikiText("[http://www.wikichat.org/index.php/WikiChat_help". " More help on WikiChat.org]");
} public function onSkinTemplateTabs( $skin, &$content_actions ) { global $wgRequest; $action = $wgRequest->getText( 'action' ); $content_actions['chat'] = array( 'class' => ($action ==
'chat') ? 'selected' : false,
'text' => "Chat",
// Vector support 'href' => $skin->getTitle()->getLocalUrl( 'action=chat' )
- 'href' => $skin->mTitle->getLocalURL( 'action=chat' )
); return true; } // Vector support public function onSkinTemplateNavigation( $skin, &$links ) { return self::onSkinTemplateTabs($skin, $links['views']); } # Needed in some versions to prevent Special:Version from breaking public function __toString() { return 'WikiChat'; } } /* class WikiChat */
/* Global function */
- Called from $wgExtensionFunctions array when initialising extensions
function wfSetupWikiChat() {
global $wgWikiChat; $wgWikiChat = new WikiChat();