vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   Modification Requests/Questions (Unpaid) (https://vborg.vbsupport.ru/forumdisplay.php?f=112)
-   -   MediWiki Integration (https://vborg.vbsupport.ru/showthread.php?t=93024)

leitel 07-27-2005 07:51 PM

MediWiki Integration
 
I have posted the stub of an article that will outline modifications needed to integrate vB users with MediaWiki. This will result in wiki users being able to login through vB. Please go to: VBulletin/Users_Integration The reason for posting this information there is because this is more of a MediaWiki hack than vB.

If anyone has or is pursuing this, please share your insights there. Thank you!

ricker 07-27-2005 09:14 PM

Quote:

Originally Posted by leitel
I have posted the stub of an article that will outline modifications needed to integrate vB users with MediaWiki. This will result in wiki users being able to login through vB. Please go to: VBulletin/Users_Integration The reason for posting this information there is because this is more of a MediaWiki hack than vB.

If anyone has or is pursuing this, please share your insights there. Thank you!

I will be checking this out.

nogerorob 07-28-2005 02:53 PM

Holy smoke. This is recent interest for me. How incredibly timely.

Thank you.

rob

Darax The Good 07-29-2005 06:46 PM

This would be a reasonable project to put some effort into. I'll contribute what I can. The single intergration thing is interesting and something which I would leverage-but it would need to be complete, and the issues at the bottom of your post show how this could be challenging.

I've been running my wiki for a week now (yeah yeah) and I've had a few bad eggs-one person even blanked around 50 articles before we blocked him and rolled everything back. It only took a few minutes to undo damage that took the attacker more than 30 minutes to create.

What I really want to do is have the 'discussion' tab turn into a vB thread discussing the article. What I'm working on doing in the meantime is making a simple script which will automatically make and/or redirect to the thread in my 'articles' discussion forum. This, I think, will be something that is absolutely necessary for an integration.

Darax The Good 07-31-2005 03:24 AM

btw, I have a media wiki template and some php code that will cause a thread to get autogenerated if it doesn't exist for an article and link to the thread if it does. I can't update the wiki with all the code, unfortuantely because of vB rules...
This is crude-and a bit hacked together. The RSS Bot guys saved me a lot of time.
Code:

<?php


//get started
error_reporting(E_ALL & ~E_NOTICE);
define('NO_REGISTER_GLOBALS', 1);
define('THIS_SCRIPT', 'WikiThread');
$phrasegroups = array();
$specialtemplates = array();
$actiontemplates = array();
$auto=0;

require_once('./global.php');
require_once('./includes/functions.php');
require_once('./includes/functions_bigthree.php');
require_once('./includes/functions_forumlist.php');
require_once('./includes/functions_newpost.php');


//See if it is an existing thread
$threads = $DB_site->query("
        SELECT * FROM " . TABLE_PREFIX . "thread
        WHERE title = 'Discussion: ".$_REQUEST['t']. "'
        AND forumid='46'       
");
//if it is, go there
while($thread=$DB_site->fetch_array($threads)){

echo($thread['forumid']);
$url = "http://www.hitchhikernet.com/forum/showthread.php?t=".$thread['threadid'];
eval(standard_redirect('',$url));
}
//the thread doesn't exist, better make sure this is a real wiki article
//or haxxors will get you.  You need to put your wiki db info in here.

$title = $_REQUEST['t'];
if($title == ''){die("No article specified");}
$wdbserver  =
$wdbusername=
$wdbpassword =
$wdbdbname =
$dbconn = mysql_connect($wdbserver,$wdbusername,$wdbpassword);

$dbacc = mysql_select_db($wdbdbname,$dbconn);
if(!$dbacc){
die("Error getting to the db...");
}

$res = mysql_query("
SELECT * FROM cur
WHERE cur_title = '".$title."'",$dbconn);

if(mysql_num_rows( $res ) < 1){
        die("Invalid Article Requested");
}
//it is a real article, add the 'default thread'
//You need to do a lot of editing here.

$threadtitle = "Discussion: ".$title;
$wikibotpost = "This is an automatically generated introductory discussion post for the article at http://www.hitchhikernet.com/index.php/".$title."";
$wikibotname = "WikiBot";
$wikibotid = 220;
$wikiforumid=46;

$foruminfo = fetch_foruminfo($wikiforumid);
$bbuserinfo = fetch_userinfo($wikibotid);

$post['signature'] = true;
$post['emailupdate'] = 9999;
$post['title'] = $threadtitle;
$post['message'] = $wikibotpost;
$post['poststarttime'] = TIMENOW;
$post['rss_date'] = TIMENOW;
$post['posthash'] = md5($post['poststarttime'] . $bbuserinfo['userid'] . $bbuserinfo['salt']);
build_new_post('thread', $foruminfo, array(), 0, $post, $errors, $wikibotid);

$url = "http://www.hitchhikernet.com/forum/wikithread.php?t=".$title;
eval(standard_redirect('',$url));


?>

and then I made a template on my wiki called fd (forum discussion)

Code:

<h3>
[http://www.hitchhikernet.com/forum/wikithread.php?t={{PAGENAMEE}} comments/discussion]
</h3>

my sig has a link to where this is currently working.

nogerorob 07-31-2005 03:30 PM

Darax, would you consider adding this information to the wiki Leitel's started?

r

Darax The Good 08-01-2005 02:23 AM

I can't because the first bit of code references vB code at the beginning and end... The best I could do is link back to here.

leitel 08-01-2005 10:35 AM

Darax, you are welcome to add your comments/code to the article I started. Notice how nogerorob did this.

The focus of this article is Users integration. Your hack addresses thread integration with the discussion tab (if got that right). QUESTION: Should my article be renamed to cover vB integration in general OR should someone start a NEW article perhaps entitled: VBulletin/Thread_Integration?

leitel 08-04-2005 03:23 PM

I am starting to dive into this again. It sure would be helpful to collaborate with any others on this. :) If you are interested, please reply here or email me. Thanks! :)

Kai Backman 08-04-2005 04:05 PM

I'm sorry to be late to the thread, but I've actually been running an integrated vBulletin/MediaWiki system for quite some time. I just today got another request from someone wanting to have the code, and realized it might be easier to just post it .. :)

MediaWiki has a facility for creating Authentication plugins that let you do the integration pretty easily. They were non-documented when I started with the hack, but once you find the correct template everything was smooth sailing. There are a few comments about the code

- People still need to log on to MediaWiki once, after that they are cookied.
- MediaWiki has a smaller namespace for usernames than vBulletin, on a large board you might have clashes. I'm assuming it's not a security problem, but it might be an inconvenience.
- You need to clean up the user properties pages of things like changing names and stuff (they aren't automatically dropped).
- The Wiki will create only those users who actually log on
- The $usergroupid clauses determine who can create an account, you need to change these clauses to suit your own board.

Have fun! :D

Add this snippet to you LocalSettings.php. Insert your vBulletin DB information:
Code:

require_once("AuthPlugin_vBulletin.php");

$wgAuth = new AuthPlugin_vBulletin(<hostname>, <vb_username>, <vb_password>, <vb_dbName);

And then AuthPlugin_vBulletin.php itself:
Code:

<?php


/**
 * Authentication plugin interface. Instantiate a subclass of AuthPlugin
 * and set $wgAuth to it to authenticate against some external tool.
 *
 * The default behavior is not to do anything, and use the local user
 * database for all authentication. A subclass can require that all
 * accounts authenticate externally, or use it only as a fallback; also
 * you can transparently create internal wiki accounts the first time
 * someone logs in who can be authenticated externally.
 *
 * This interface is new, and might change a bit before 1.4.0 final is
 * done...
 *
 * @package MediaWiki
 */
require_once("includes/AuthPlugin.php");

class AuthPlugin_vBulletin extends AuthPlugin {

  // Persistent DB connection
  var $vb_database;

  function AuthPlugin_vBulletin($host, $username, $password, $dbname)
  {
    $this->vb_database = mysql_pconnect($host, $username, $password);
    mysql_select_db($dbname, $this->vb_database);
  } 


  /**
  * Check whether there exists a user account with the given name.
  * The name will be normalized to MediaWiki's requirements, so
  * you might need to munge it (for instance, for lowercase initial
  * letters).
  *
  * @param string $username
  * @return bool
  * @access public
  */
  function userExists( $username ) {
    $username = addslashes($username);
    $vb_find_user_query = "SELECT usergroupid FROM user WHERE LOWER(username)=LOWER('" . $username . "')";
    $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database);
    if(mysql_num_rows($vb_find_result) == 1) {
      $vb_user_info = mysql_fetch_array($vb_find_result);
      $usergroupid = $vb_user_info['usergroupid'];
      // Only registered and admins. Banned and unregistered don't belong here.
      if($usergroupid == "2" || $usergroupid == "5" || $usergroupid == "6" || $usergroupid == "7")
        return true;
    }
    else
      return false;
  }
       
  /**
  * Check if a username+password pair is a valid login.
  * The name will be normalized to MediaWiki's requirements, so
  * you might need to munge it (for instance, for lowercase initial
  * letters).
  *
  * @param string $username
  * @param string $password
  * @return bool
  * @access public
  */
  function authenticate( $username, $password ) {
    $username = addslashes($username);
    $vb_find_user_query = "SELECT password, salt, usergroupid FROM user WHERE LOWER(username)=LOWER('" . $username . "')";
    $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database);
    if(mysql_num_rows($vb_find_result) == 1) {
      $vb_user_info = mysql_fetch_array($vb_find_result);
      $usergroupid = $vb_user_info['usergroupid'];
     
      // Only registered and admins. Banned and unregistered don't belong here.
      if($usergroupid == "2" || $usergroupid == "5" || $usergroupid == "6" || $usergroupid == "7")
        if(md5(md5($password) .  $vb_user_info['salt']) == $vb_user_info['password'])
          return true;
    }
    return false;
  }
       
  /**
  * Return true if the wiki should create a new local account automatically
  * when asked to login a user who doesn't exist locally but does in the
  * external auth database.
  *
  * If you don't automatically create accounts, you must still create
  * accounts in some way. It's not possible to authenticate without
  * a local account.
  *
  * This is just a question, and shouldn't perform any actions.
  *
  * @return bool
  * @access public
  */
  function autoCreate() {
    return true;
  }
       
  /**
  * Return true to prevent logins that don't authenticate here from being
  * checked against the local database's password fields.
  *
  * This is just a question, and shouldn't perform any actions.
  *
  * @return bool
  * @access public
  */
  function strict() {
    return true;
  }
       
  /**
  * When creating a user account, optionally fill in preferences and such.
  * For instance, you might pull the email address or real name from the
  * external user database.
  *
  * The User object is passed by reference so it can be modified; don't
  * forget the & on your function declaration.
  *
  * @param User $user
  * @access public
  */
  function initUser( &$user ) {
    $vb_find_user_query = "SELECT password, salt FROM user WHERE LOWER(username)=LOWER('" . addslashes($user->mName) . "')";
    $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database);
    if(mysql_num_rows($vb_find_result) == 1) {
      $vb_user_info = mysql_fetch_array($vb_find_result);
      $user->mEmail = $vb_user_info['email'];
    }
    else {
      // ERROR?
    }
  }
}


?>


leitel 08-04-2005 04:11 PM

Thank you so much for sharing this. I will look it over. I saw that stub class and wondered if it could be used. At this point, I am in the analyzing mode. Input from others like yourself will produce the maximum results. Of course, whatever I/we come up with will be shared.

Thanks! :)

ndahiya 08-12-2005 06:36 PM

Hi

A couple of small doubts... Does the user have to register for Media Wiki ? I already have a user DB, and getting the ones who want to register again might be cumbersome... If yes, is there some way to "transfer" the userDB?

Just thinking aloud:

IS this a valid (though less elegant) solution: on the edit page of the wiki, check to see if the user is logged onto vbulletin (using the cookie). if not, bump them to the login page... ???


Quote:

Originally Posted by Kai Backman
MediaWiki has a facility for creating Authentication plugins that let you do the integration pretty easily. They were non-documented when I started with the hack, but once you find the correct template everything was smooth sailing. There are a few comments about the code

- People still need to log on to MediaWiki once, after that they are cookied.
- MediaWiki has a smaller namespace for usernames than vBulletin, on a large board you might have clashes. I'm assuming it's not a security problem, but it might be an inconvenience.
- You need to clean up the user properties pages of things like changing names and stuff (they aren't automatically dropped).
- The Wiki will create only those users who actually log on
- The $usergroupid clauses determine who can create an account, you need to change these clauses to suit your own board.

Have fun! :D


leitel 08-12-2005 07:20 PM

That is exactly what I am going to do. I have it already working with our OSCommerce site. If there is a cookie, they don't even know that they have been automatically logged into vB. The Wiki is a bit more tricky. Please see article where I have outlined some details.

Kai Backman 08-12-2005 07:55 PM

They don't need to register, MediaWiki creates an account automatically for them the first time they log in. However, the AuthPlugin still requires MediaWiki to have separate user information, even if it's just the name. The comments give more information on how it works.

leitel 08-12-2005 08:39 PM

You're right. What happens in the scenario I mentioned previously is when a user goes to the wiki, it will check vB to see if there is a cookie. If not, they will be taken to vB to login or create an account. The process of creating an account ALSO creates an account in the wiki for them. There a number of preferences, etc that are best maintained in the wiki.

There is still a need to maintain 'connections' to vB and back. For example, see this page as an example to link to vB profile from the wiki.

Hopefully, we will begin coding this next week.

Mek 08-18-2005 09:56 AM

Hi folks, I just tired out Kai Backman's integration authplugin; I was wondering if there is a way to make registering a user on the wiki create a coresponding vbulletin account. Or would I simply turn off the new user creation to force registration on the vbulletin end?

Viktor Kraft 08-22-2005 01:08 AM

Quote:

Originally Posted by Mek
Hi folks, I just tired out Kai Backman's integration authplugin; I was wondering if there is a way to make registering a user on the wiki create a coresponding vbulletin account. Or would I simply turn off the new user creation to force registration on the vbulletin end?

At least, you can do the second one easily :)

On your LocalSettings.php find
PHP Code:

require_once( "includes/DefaultSettings.php" ); 

Add below
PHP Code:

# Only sysops can register new users
$wgWhitelistAccount = array ( "sysop" => 1"developer" => ); 


Burgy 09-01-2005 09:46 PM

Allthough the user integration through MW Authplugin and automatic acount creation in MW if not existant seems to be the most professional solution. There is a miner drowback of how to handle change of preferences and logout situations.

some thoughts about unsolved problems
  1. Preferences such as email do exist and are stored twice the vB and MW and should be changed in vB by user and then be updated in MW automaticly
  2. Logout should be made global which means that logout manualy in either vB or MW should log out both automaticly to be secure
  3. or even better the login in MW should just use the db of vB but not the login procedure then there could serveral MW installations eg german and english been run together useing the centralised vB User Data

The above thougts are not critic but merely helpless nonprogrammer effort to contribute on the grounds of checking possible cases.

shortes way by logic with smalles chance of interference
I do hope that in the end there can be achived a working bridge that does as little as possible except checking user data in the vB Database and producing doubles in MW in order to make things independent. The Preferences which exist twise should be changed in vB because of code copyright bull++++ and then updated in MW automaticaly where only Preferences should be changeble which are nonexistant in vB.


I hope my thoughts might trigger some genius programmers efforts to solve the problem with minimum effort.

Sincerely yours
Burgy Zapp with greatings from Hagenheim

ndahiya 09-03-2005 02:17 PM

hi

i get the following error
Quote:


Fatal error: Call to a member function on a non-object in /home/jatland/public_html/wiki/includes/SpecialUserlogin.php on line 314
maybe it is coz of the version i am using ? (1.5RC4).. Would really appreciate help on this.. TIA.



also,

Quote:

Originally Posted by Burgy
some thoughts about unsolved problems
  1. Preferences such as email do exist and are stored twice the vB and MW and should be changed in vB by user and then be updated in MW automaticly
  2. Logout should be made global which means that logout manualy in either vB or MW should log out both automaticly to be secure
  3. or even better the login in MW should just use the db of vB but not the login procedure then there could serveral MW installations eg german and english been run together useing the centralised vB User Data

this would be excellent to have... anyone made any progress on this ?

Yorixz 09-11-2005 10:24 AM

I'm wondering; does anyone have this running with vB3.5 and secondly; is it possible to run MediaWiki on windows?

Gary King 09-12-2005 12:44 AM

Quote:

Originally Posted by Yorixz
I'm wondering; does anyone have this running with vB3.5 and secondly; is it possible to run MediaWiki on windows?

I am also curious about if this works with vBulletin 3.5

Also, yes, MediaWiki will run on Windows, just like any other PHP/MySQL script.

Yorixz 09-12-2005 05:03 AM

Quote:

Originally Posted by Gary King
I am also curious about if this works with vBulletin 3.5

Also, yes, MediaWiki will run on Windows, just like any other PHP/MySQL script.

Last time I tried it (like a year ago) it only worked on Linux because the difference in parsing of PHP on Linux/Win back then (something with quotes or so was it)

Thanks for your reply :)

Gary King 09-13-2005 07:00 PM

Quote:

Originally Posted by Yorixz
Last time I tried it (like a year ago) it only worked on Linux because the difference in parsing of PHP on Linux/Win back then (something with quotes or so was it)

Thanks for your reply :)

Magic quotes? That's just an option.

sub_ubi 09-15-2005 04:30 PM

This thread, or parts of it, should be moved to hacks. It's good stuff.

ndahiya 10-04-2005 11:14 AM

bump.

just checking if there is a update to this ? i am still getting the error is post #19 (even with the older mediawiki version. the user needs to refresh the error page for it to work correctly)...

would be super if a "tight" integration could be achieved!

Reeve of shinra 10-04-2005 01:19 PM

[tagging thread for myself] -- I'm curious about how well this is working now with 3.5 gold.

Reeve of shinra 10-13-2005 11:33 PM

*bump*

ndahiya 10-16-2005 12:56 AM

*bump*

/me hopes for the best.

pipin 10-16-2005 05:42 PM

i tested the whole thing with a local test forum 3.5.0 and mediawiki 1.5.0 and it works, only a minor glitch that vb user names which begins with a lower-case character are transformed into a wiki user name beginning with an upper-case character. :surprised:

Yorixz 10-16-2005 05:50 PM

I'm glad to hear that it works, I guess I'll start trying it out on a localhost aswell later.

weeno 10-23-2005 07:56 PM

Can someone explain how the namespaces on vbulletin and mediawiki usernames are different? What would cause a collision?

arn

GrendelKhan{TSU 10-24-2005 03:31 AM

bump!

[high]* GrendelKhan{TSU hopes there is still interest in this. :)[/high]

weeno 10-26-2005 05:02 AM

I've been trying to use this code to integrate a wiki and vbulletin.

There's a mistake in the initUser function... note the database query isn't correct. I fixed it here:

HTML Code:

function initUser( &$user ) {
    $vb_find_user_query = "SELECT email FROM user WHERE LOWER(username)=LOWER('" .
addslashes($user->mName) . "')";
    $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database);
    if(mysql_num_rows($vb_find_result) == 1) {
      $vb_user_info = mysql_fetch_array($vb_find_result);
      $user->mEmail = $vb_user_info['email'];
    }
    else {
      // ERROR?
    }
  }

is no one else working on this/ interested in this?

So, it seems the "_" underscore is the one of the forbidden chars in mediawiki.... so might cause some collision issues with vb's user database.

still working on this to see how to best resolve these issues.

arn

GrendelKhan{TSU 10-27-2005 10:13 AM

Quote:

Originally Posted by weeno
I've been trying to use this code to integrate a wiki and vbulletin.

There's a mistake in the initUser function... note the database query isn't correct. I fixed it here:

HTML Code:

function initUser( &$user ) {
    $vb_find_user_query = "SELECT email FROM user WHERE LOWER(username)=LOWER('" .
addslashes($user->mName) . "')";
    $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database);
    if(mysql_num_rows($vb_find_result) == 1) {
      $vb_user_info = mysql_fetch_array($vb_find_result);
      $user->mEmail = $vb_user_info['email'];
    }
    else {
      // ERROR?
    }
  }

is no one else working on this/ interested in this?

So, it seems the "_" underscore is the one of the forbidden chars in mediawiki.... so might cause some collision issues with vb's user database.

still working on this to see how to best resolve these issues.

arn

well I'm glad someone is working on it. Sorry I can't contribute on that end. but just wanted to say I think this would be a KILLER hack if ya got it work. :)

<<< keeps fingers crossed. :)

eva01_ 10-27-2005 04:30 PM

I have been trying to work this out for 3.5 as well, i will post any of my results here.

ndahiya 10-28-2005 12:42 AM

Ya, the namespace is a problem... One way around it is to limit the vb name space... you want to make sure there are no spaces etc... i just do it in the vbulletin register.php file in vb...

---
Another point:

Not sure what the error was in the original code, BUT even after using the code by weeno, i get this error the FIRST time a user logs in (with the correct password)

Quote:

Fatal error: Call to a member function on a non-object in /home/sitename/public_html/wiki/includes/SpecialUserlogin.php on line 314

the user is actually created, but this error still comes up... not sure why... the user can then login.. i am isung mediawiki 1.5 and vb 3.5...

Thx.



Quote:

Originally Posted by weeno
I've been trying to use this code to integrate a wiki and vbulletin.

There's a mistake in the initUser function... note the database query isn't correct. I fixed it here:

HTML Code:

function initUser( &$user ) {
    $vb_find_user_query = "SELECT email FROM user WHERE LOWER(username)=LOWER('" .
addslashes($user->mName) . "')";
    $vb_find_result = mysql_query($vb_find_user_query, $this->vb_database);
    if(mysql_num_rows($vb_find_result) == 1) {
      $vb_user_info = mysql_fetch_array($vb_find_result);
      $user->mEmail = $vb_user_info['email'];
    }
    else {
      // ERROR?
    }
  }

is no one else working on this/ interested in this?

So, it seems the "_" underscore is the one of the forbidden chars in mediawiki.... so might cause some collision issues with vb's user database.

still working on this to see how to best resolve these issues.

arn


exceem 10-28-2005 05:48 PM

im goign to give this a go over the weekend on a test setup, hopefulyl it will work ok

weeno 11-01-2005 01:28 PM

we went live:
http://www.macrumors.com/pages/2005/...30152853.shtml

arn

d4v3r5 11-02-2005 01:23 AM

Quote:

Originally Posted by weeno

saweet!
howzit workin so far?
you gonna release a hack for the rest of us? :)

GrendelKhan{TSU 11-02-2005 02:29 AM

Quote:

Originally Posted by d4v3r5
saweet!
howzit workin so far?
you gonna release a hack for the rest of us? :)

what he said!!

or you just teasin us? :(. lol looks good though!! (mouth waters) :p

pushing my luck: if you do release it....is it going to phrased? that is a huge point for many (me!) :)


All times are GMT. The time now is 11:26 PM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.02054 seconds
  • Memory Usage 1,891KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (4)bbcode_code_printable
  • (3)bbcode_html_printable
  • (2)bbcode_php_printable
  • (13)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (2)pagenav_pagelink
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (40)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • printthread_start
  • pagenav_page
  • pagenav_complete
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete