Logs theft met PHP/MySQL

Door Sgreehder op vrijdag 5 april 2013 16:45 - Reacties (2)
Categorie: Perpetuum, Views: 2.396

Voor Perpetuum, een sandbox-MMOG, heb ik een stapel scripts ontwikkeld om berichten van in-game chatkanalen te pushen (dmv. long polling) naar bezoekers op een website. Op deze website heb ik, naast deze tool, een selectie van hulpmiddelen voor dit spel geplaatst.

Allereerst even wat over Perpetuum. Op de oppervlakte is deze 'Hungarian-made' MMOG behoorlijk vergelijkbaar met EVE Online, met het duidelijk verschil dat het om 'robots op eilanden' gaat. Ook in Perpetuum is het een kwestie van een paar korte tutorials afwerken, en daarna mag je het zelf allemaal bekijken. Robots zijn modulair opgebouwd, en ook de overview op de UI is vertegenwoordigd. Zoals in EVE is de markt grotendeels gevuld met producten van andere spelers, maar de lage populatie (ik vermoed zelf rond de 500-600 actieve spelers) en producenten die alleen actief zijn binnen corporaties/coalities zorgen voor een wat karig aanbod.

De verschillen zijn ook opvallend; het approach/orbit-patroon is vervangen door een WSAD-patroon, skills (hier: extensions) kunnen selectief worden opgewaardeerd (achteraf vergelijkbaar met Dust, grappig genoeg), en PVP is snel en heeft opvallende kenmerken (zo kan dicht op elkaar vechten tot gevolg hebben dat sensoren flink worden verstoord en een ontploffing kan een kettingreactie veroorzaken die een hele groep kan vernietigen).

Goed, de Perpetuum-client kan dus een log bijhouden van open chatkanalen. Daarnaast zijn de Perpetuum-servers zo goed als 24/7 online (geen downtime, behalve voor patches), en de client duldt langere periodes van inactiviteit van de spelers. De berichten worden direct bijgeschreven in een bestand (per kanaal), dus het was voor mij zaak te beginnen met een tail -f implementatie voor Windows, die nieuwe berichten kan doorsturen (met behulp van een POST request bijvoorbeeld) naar de website. Hoewel het mogelijk kan met een wat losse applicaties en een pipe in PowerShell, leek het me toch handiger dit met een PHP CLI-applicatie te doen. Deze kan dan in een loop werken en om de paar seconden de bestanden pollen voor veranderingen, en gelijk wat PCRE en Purificatie toepassen.

De code van een tail implementatie in PHP (van dit voorbeeld):


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function tail($filename, $lines = 10, $buffer = 4096) {
        
    $f = fopen($filename, "rb");
    fseek($f, -1, SEEK_END);
    if(fread($f, 1) != "\n") $lines -= 1;
    
    $output = '';
    $chunk = '';
        
    while(ftell($f) > 0 && $lines >= 0) {
        $seek = min(ftell($f), $buffer);
        fseek($f, -$seek, SEEK_CUR);
        $output = ($chunk = fread($f, $seek)).$output;
        fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR);
        $lines -= substr_count($chunk, "\n");
    }
    
    while($lines++ < 0) {
        $output = substr($output, strpos($output, "\n") + 1);
    }
        
    fclose($f);
    return $output;
}



Het CLI-script stuurt in het geval van nieuwe berichten een POST-request naar de webserver, die deze in een database opslaat en de laatste 15 berichten per kanaal wegschrijft naar een filesystem.

Op de website zelf wordt javascript geserveerd met herhalende asynchronous requests (met een lange time-out) naar een long polling script, vergezeld met een 'since' parameter. Mochten er dus nieuwe berichten zijn, dan kunnen deze direct worden doorgezet, anders blijft het script om de paar seconden het filesystem op wijzigingen pollen. Dit script draait voor maximaal 30 seconden (vandaar 'long polling'), waarna de browser simpelweg een nieuwe request verstuurt.

Het resultaat:

http://sequer.nl/?a=chat-default

Volgende: Livestream 'coding jam' 04-'13 Livestream 'coding jam'
Volgende: Mobiele providers een hak zetten 05-'11 Mobiele providers een hak zetten

Reacties


Door Tweakers user RobIII, vrijdag 5 april 2013 18:41

Ik begrijp als (bijna, zo-goed-als) non-gamer even niet wat dit met "Logs theft" te maken heeft? Er komt gewoon data over de lijn fietsen ("logs"? of hebben we 't over chatberichten) van je client die je vervolgens uit een file pulkt en naar een webserver stuurt die ze op zijn beurt weer naar bezoekers stuurt? Begrijp ik 't zo goed?

De data die over de lijn komt fietsen is toch gewoon "data" die "men" naar jou heeft gestuurd (en dus bestemd voor jou of je client) en die jij daarna "openbaart"? Ik zie niet hoe dat theft is; dat is toch niets anders dan herpublicatie (ofwel: papegaaien van data naar een ander medium)?

Of begrijp ik er geen zak van? :P Of het de bedoeling is dat je die data "(her)openbaart" is natuurlijk een tweede, maar ik zie in ieder geval niets in de uitleg dat wijst op iets dat je toegang hebt weten verschaffen tot data die niet voor jou of je client bedoeld is en dus val ik over 'theft' :P

[Reactie gewijzigd op vrijdag 5 april 2013 18:42]


Door Tweakers user Sgreehder, zaterdag 6 april 2013 02:55

Overthinking it. Het is met name bedoelt voor mensen 'voor op het werk', waarbij het een leuke optie is dat publieke channels 'vanuit een spel' real-time te volgen zijn. Politiek is alles binnen dit soort spellen.

Reageren is niet meer mogelijk