[B]Steg 1:[/B]
[I]Vad händer vid en omstart?[/I]
Förutom att irc-server-klonen ansluter mot den riktiga servern? Inte ett barr. De användare som har skrivit något - och upptäckt att text är borta - ligger fortfarande kvar i incoming. Dessutom har sessionerna identiferat vissa användare felaktigt, vilket inte är bra. Träffsäkerheten är usel. Namn jag knappt känner igen har plockats upp från ett svart hål.
Lösning: Skriv om den del av scriptet som tillhandahåller identifieringen och inkommande text. Frågan är dock hur - vilket blir nästa steg.
[B]Steg 2:[/B]
Eftersom den första chatten i princip bara hade stöd för vBulletin så blir det definitivt en utmaning att få den att fungera felfritt mot ett phpBB-forum. Första delen gick förstås relativt smärtfritt - att globalisera alla cookies så att chattservern känner igen alla användarna. Effekten som uppstod var till en början inte jättebra - inloggningen för användarna slutade fungera under en ibland frustrerande period, utan att jag egentligen hade en aning om varför. Det räckte inte med att radera alla cookies och starta om webläsaren. Fenomenet var oförklarligt.
Eftersom flash inte heller verkar stödja referers särskilt bra så försvårar det webserverns identifiering så till den grad att det ibland inte fungerar alls; folk döps helt omotiverat om till root (vilket är irc-serverns "chef").
Så om vi tar oss en titt på hur phpBBs sessioner ser ut, så ser vi dels att de är plågsamt jobbiga. IP-adresserna skrivs förstås inte ut i klartext, så allt som sker måste översättas med speciella funktioner. Jag kan väl säga så mycket att jag inte vågar tänka på vad som sker när man blandar in ipv6 i spektaklet. Med andra ord; det uteblir ett tag till. Cookien som kommer från RVD heter rvdcookie_sid hade varit oerhört användbar om det inte hade varit för att den ibland inte plockas upp av webservern ordentligt. Men även om den skulle plockas upp så skulle sessionen dö efter en kvart och personerna som chattar skulle återigen identifieras som root. Hur löser vi då detta?
Faktum är att users-databasen har en kolumn redan som heter sessionhash. Den hade jag nästan glömt. Den används dessutom redan mot vBulletin. Med andra ord så är det irc-klonen vi ska ge oss på. Så fort det finns en session på användaren får vi låta den identifiera nicket.
[php] $username = convertnick($data[username]);
$sesshash = $data['session_id'];
$sessuser = $data['session_user_id'];
// Update remote sessions as fast as we see the user online, and never put them off-server.
if ($sesshash && $sessuser)
{
$tornevall->db->query("UPDATE forumirc.users
SET sessionhash = '".$tornevall->injection($sesshash)."', forumuserid = '".intval($sessuser)."'
WHERE nick = '".$tornevall->injection($username)."'");
}[/php]Detta bör göra att vi istället kan hämta upp användarnamnet igen från irc-bryggan, vilket görs som en slutlig åtgärd om användarid fortfarande inte hittas på det normala sättet.
[php] // Collect hashes of the forums you want to find a user at!
$hashlist = array();
if ($_COOKIE['bbsessionhash'])
{
$vbhash = $_COOKIE['bbsessionhash'];
$hashlist[] = $vbhash;
}
if ($_COOKIE['rvdcookie_sid'])
{
$rvdhash = $_COOKIE['rvdcookie_sid'];
$hashlist[] = $rvdhash;
}
// The only friend you need!
// Convert that shite to a query!
foreach ($hashlist as $hashes) {$hashdata .= "sessionhash = '".$tornevall->injection($hashes)."' OR ";}
$hashdata = preg_replace("[ OR $]", "", $hashdata);
$hashtest = $tornevall->db->query_first("SELECT * FROM forumirc.users WHERE " . $hashdata . " ORDER BY lastactivity ASC");
if ($hashtest['nick'])
{
$theuser = $hashtest['nick'];
$uid = $hashtest['forumuserid'];
}
else
{
$theuser = "root";
$uid = 0;
}
$test = $tornevall->db->query_first("SELECT * FROM forumirc.users WHERE nick = '".$tornevall->injection($theuser)."'");
// Does the server exist on the server? YOU FIX!
if ($test['server'] != "forum.tornevall.net")
{
$theuser .= "_" . $test['idx'];
}
$theuser = convertnick($theuser);
[/php] [B]Steg 3:[/B]
Nästa steg blir att plocka ut all chatt-text ur incoming som fortfarande inte blivit skickat ordentligt. Detta gör vi genom att dynamiskt skapa de användare som ännu inte behandlats, för att de saknas och sedan ta bort dem igen.
[php] // Are there still speaking people in the database?
// Probably, they does not exist for some reason, so let's create
// them dynamically - and temporary - so they can speak, no matter
// who they are! Using "GROUP BY" will only create them ONCE or else
// there will be a disaster somewhere!
$stillthere = $tornevall->db->query("SELECT * FROM forumirc.incoming GROUP by nick ORDER BY ts ASC");
$tmpuserlist = array();
while ($tmpusers = $tornevall->db->fetch($stillthere))
{
$thenick = $tmpusers['nick'];
$thenick = convertnick($thenick);
$ishere = $tornevall->db->query_first("SELECT * FROM forumirc.users WHERE nick = '".$thenick."'");
// Is this user here? If so, just secure yourself that it really on the real server!
if ($ishere['nick'])
{
if ($ishere['server'] != 'forum.tornevall.net')
{
// If it's not on the real server, create a unique nick, based on the virtual id!
$thenick .= "_" . $tmpusers['idx'];
}
}
// Make a recheck!
$ishere = $tornevall->db->query_first("SELECT * FROM forumirc.users WHERE nick = '".$thenick."'");
// If it's not online, create it!
if (!$ishere['nick'])
{
$tmpuserlist[] = $thenick;
$user[nick] = $thenick;
$user[mail] = $thenick;
$user[userinfo] = "Virtually created stuff!";
$user[mode] = "+i";
$user[ip] = gethostbyname($tmpusers['ip']);
$user[lastactivity] = time();
$user[host] = $tmpusers['ip'];
$user[guest] = 0;
$user[tmpuser] = 1;
$forum[$thenick] = $username;
$forumrules[$thenick] = $tmpusers['channel'];
createuser($user);
send(":$thenick JOIN " . $tmpusers['channel']);
unset($user);
}
}
// Do the procedure again without the grouping...
$stillthere = $tornevall->db->query("SELECT * FROM forumirc.incoming ORDER BY ts ASC");
while ($onscreen = $tornevall->db->fetch($stillthere))
{
$sendnick = $onscreen['nick'];
$sendchan = $onscreen['channel'];
$sendtext = $onscreen['text'];
// Send and clean up incoming
speak($sendnick, $sendchan, $sendtext);
$killsent = $tornevall->db->query("DELETE FROM forumirc.incoming WHERE idx = '".$onscreen['idx']."'");
}
// Now, clean up our temporary forgotten users!
foreach ($tmpuserlist as $killthisuseragain) {killuser($killthisuseragain, "I was just temporary - Bye");}
unset($tmpuserlist);[/php]
And then, we are DONE!

Hahaha Vickan...jag håller med...:haha::Bigsmile:
Ja, dags att städa lite kanske? :)