Huom: T.M.:ää ärsyttää hirveesti kun käytän hymiöitä jotenki hirveesti ja kaikkee ja se etten kerro tässä sitä minkä jokainen selväjärkinen tajuaisi, et tää (ainaski kuvaus, ja sorsat) on siis lähinnä läppä. :)
Tälle myslipohjainen versio jossa muutaki vähä paranneltu. Teinpäs tämmösen kun omilla sivuillani o myslituki ja flatfilet on iha plääh. Huomasin että pitkät ja moniriviset viestit on iha turhia ja ne vaan sottaa koko seinän. :D Lisäsin myös tommose tekstit-saa-mennä-vain-oikeelle-tuen ja haalistumisen.
Koska sivuillani on tommone yla- ja ala.php -viritelmä ja tein tänki sillain ku se on niin kätevää niin karsin omista filuistani nyt tähänki tommoset, joissa siis printataan <html>-tagit, alustetaan mysliconnectiot ym kaikkee kivaa. Jos käytät iteki jotain ton tyylistä niin laita vaikka myslin alustukset sinne. Noi on tietenkin vaan esimerkkejä miten ton voi tehdä.
Tekstit haalistuvat joka kerta ku joku kirjottaa vähän, koska yleensä se joka kirjottaa siihe jotain haluaa että oma teksti näkyy muita paremmin (no oikeesti toi on noin koska halusin tähä haalistumise mut laiskotti ja tein simppelillä tavalla)
Kannattaa heittää noi hakemistoon jonka chmodaa niin että skriptillä on kirjoitusoikeudet sinne, muute kuvan luonti voi vähän epäonnistua :)
Arcatanille terkkui <3 se kekkas idean hinkkaa seinää -toiminnolle! (15:31 < arcatan> sooda: tee sinne hinkkaa seinää-toiminto!)
Tejeezilleki terkkui <3 se piirs mulle kuvan kaakelista!
Blazelleki terkkui <3 se kekkas tosihassun eri filu -ilmoituksen (16:57 <@Blaze_> väliin vaan joku *** HOX! eri filu!) (mokomaki Laaksonen, terkkui kanssa sille, listauslootii sais olla enempi)
Terkkui kans niille jotka testas tota kun heitin linkin #ohjelmointiputkaan <3
Ja Gwaurille terkkui <3 (20:18 <+Gwaur> sooda: sun graafinen vessanseinäsimu kakkone -vinkkis ekan listauksen alussa on kirjotusvirhe, siellä lukee "ero filu"!)
Kipeesti listauksia, ja osat koodista eri tavalla ku mulla :o Toivottavasti toimii muillakin...
Ainiin, ei oo enää demoa missään. Äläkä edes käytä kun tämä on ihan kehno.
Ainiin, ja avaa toi admin.php ennen ku käytät, se luo ton myslitaulun siis.
Ainiin :D, muokkaa yla.php:sta noi admin- ja myslitiedot kuntoon. Adminina pääsee sisää tyyliin admin.php?admin_in ja adminhomma vaatii keksit. Voit tietenki muokata paremmaks jos toi ei tyydytä, tää on koodivinkki. :)
index.php
<?php // ja tästä sitä sit käytetään $otsikko = "Vessanseinäsimu"; include "tiadot.php"; echo "<form method=\"get\" action=\"add.php\"><p><input type=\"text\" class=\"tekstiloota\" name=\"t\" maxlength=\"32\" /><input type=\"submit\" value=\"riipusta\" /> Saat kirjoittaa yhden viestin $floodiaika sekunnin sisällä.<br /> <a href=\"hinkkaa.php\">Leiki siivoojaa</a>" . (file_exists("vessa.png") ? "<br /><img src=\"$kuvafilu\" alt=\"Vessan seinä\" />" : "") . "</p></form>"; include "ala.php"; ?> *** HOX! eri filu! *** tiadot.php <?php // tein systeemin helpoksi ja säädin asetustiedostosysteemin <3 include "yla.php"; // alustetaan sivut /* ite löysin servuni /usr/share/fonts/TTF -hakemistosta. Kiva fontti, mutta jos * haluat vaihtaa niin tutki jostain. Joo vois laittaa mun fontit tähän servukone TTF # ls *.ttf Vera.ttf VeraMoBI.ttf VeraSe.ttf luximr.ttf luxirr.ttf luxisr.ttf VeraBI.ttf VeraMoBd.ttf VeraSeBd.ttf luximri.ttf luxirri.ttf luxisri.ttf VeraBd.ttf VeraMoIt.ttf luximb.ttf luxirb.ttf luxisb.ttf VeraIt.ttf VeraMono.ttf luximbi.ttf luxirbi.ttf luxisbi.ttf */ $fontti = "VeraMono.ttf"; // kiva niistä // kuvan taustaväri jos ei käytetä valmista kuvaa $tausta = array(240, 240, 240); // olennainen kuvan koon säätö $leveys = 800; $korkeus = 800; /* jos käytetään pohjana valmista kuvaa. huomaa et tätä käyttäessä taustaväri * ja leveys ja korkeus ei vaikuta. */ // $kuvasta = "muuri.png"; // tekstien värien rajat, eka r, sitte g ja lopuks b:n min- ja max-arvot $tekstivärirajat = array(array(0, 127), array(0, 127), array(0, 127)); $tekstikoko = array(8, 20); // tekstin koon rajat $kuvafilu = "vessa.png"; // filut joihin varastoidaan kuvatiedot $taulunnimi = "vessa"; // myslitaulun nimi /* tekstit saa mennä vain oikealle päin jotta luettavuus pysyy eikä lukijan * tartte mennä ylösalasi. laita jotai epä-trueta jos haluat pois päältä */ $vain_oikeelle = true; /* ton nimen pitäs kertoo. kun jonkun haalistuma on 255 niin se lähtee pois kokonaan * eli siis ton verran haalistuu kun lisätään yks teksti tai hinkataan seinää */ $paljonks_haalistuu_kerralla = 7; // montako sekuntia saa odottaa ennen kuin samasta ip:stä saa lähettää uudestaan $floodiaika = 60; // luo kuvan valmiiks. tein tästä funkkarin ku käytetään useasti ja on vähä pidempi koodi function teekuva() { global $kuvasta, $kuva, $tausta, $leveys, $korkeus; if (isset($kuvasta)) { // tehdään kuva valmiista kuvasta $pääte = substr($kuvasta, -4); if ($pääte == ".png") $kuva = imagecreatefrompng($kuvasta); elseif ($pääte == ".jpg") $kuva = imagecreatefromjpeg($kuvasta); elseif ($pääte == ".gif") $kuva = imagecreatefromgif($kuvasta); } if (!$kuva) { // joko valmista kuvaa ei määritelty tai sen lataus ei onnannut $kuva = imagecreatetruecolor($leveys, $korkeus); imagefill($kuva, 0, 0, imagecolorallocate($kuva, $tausta[0], $tausta[1], $tausta[2])); } } ?>
add.php
<?php // Koko systeemin ydin. Lisää kuvaan tekstin $otsikko = "Vessanseinäsimu"; include "tiadot.php"; $teksti = trim($_GET["t"]); // tyhjiä tekstejä on turha lisätä ja kokemus on opettanut et pitkät tekstit on vaan pahasta :P if ($teksti == "" || strlen($teksti) > 32) { header("Location: index.php"); // mennään siis takasi die(); } // floodesto! jos samasta ip:stä on jo lähetetty tietyn ajan sisällä ni ei anneta piirtää (hyväksi koettu ;) if (mysql_result(mysql_query("SELECT COUNT(*) FROM $taulunnimi WHERE ip = '$_remote_ip' AND aika > '" . ($_aika - $floodiaika) . "';"), 0)) { header("Location: index.php"); die(); } // arvotaan kamoja $tekstin_koko = rand($tekstikoko[0], $tekstikoko[1]); if ($vain_oikeelle) $kulma = rand(0, 1) ? rand(0, 90) : rand(270, 360); else $kulma = rand(0, 360); $väri_r = rand($tekstivärirajat[0][0], $tekstivärirajat[0][1]); $väri_g = rand($tekstivärirajat[1][0], $tekstivärirajat[1][1]); $väri_b = rand($tekstivärirajat[2][0], $tekstivärirajat[2][1]); /* lasketaan tekstipalikan viemä tila. * Kelaillaan eka tekstin leveys */ $pituus = strlen($teksti); // kuinka paljo suunnilleen vie tilaa x- ja y-suunnassa $xpituus = abs(cos(deg2rad($kulma))) * $pituus * $tekstin_koko; $ypituus = abs(sin(deg2rad($kulma))) * $pituus * $tekstin_koko; // katotaan kumpaan suuntaan teksti on menossa $xsuunta = ($kulma >= 0 && $kulma < 90) || ($kulma > 270) ? 1 : 0; // 1 == oikeelle $ysuunta = ($kulma > 180) ? 1 : 0; // 1 == alas /* Arvotaan koordinaatit mistä teksti lähtee menemään. * Esim x-suunnassa: Jos teksti menee oikealle, niin se saa alkaa nollasta ja * loppukohdaksi viritetään semmonen että se suunnilleen mahtuu kuvaan. * Ei seinän yli kirjoittaminen ole kilttiä. Jos taas teksti menee vasemmalle * päin, niin sen alkukohta pitää arpoa niin että loppupää (vasemmalle kun * mennään) ei mene kuvan yli. */ $x = rand($xsuunta ? 0 : $xpituus, $leveys - $xsuunta * $xpituus); $y = rand($ysuunta ? 0 : $ypituus, $korkeus - $ysuunta * $ypituus); // tehdään kuva teekuva(); // Ja teksti mukaan kuvaan. imagettftextissä on kätevästi piirtokulma mukana imagettftext($kuva, $tekstin_koko, $kulma, $x, $y, imagecolorallocate($kuva, $väri_r, $väri_g, $väri_b), $fontti, stripslashes($teksti)); // koska muitaki muutetaan ni ne pitää piirtää uusiks kuvaan $muut = mysql_query("SELECT * FROM $taulunnimi;"); if (mysql_num_rows($muut)) { // jos löytyy // haalistutetaan muita ja poistetaan liikaa haalistuneet mysql_query("UPDATE $taulunnimi SET haalistuma = haalistuma + $paljonks_haalistuu_kerralla;"); mysql_query("DELETE FROM $taulunnimi WHERE haalistuma = 255;"); while ($muu = mysql_fetch_assoc($muut)) // piirretään ne muut imagettftext($kuva, $muu["koko"], $muu["kulma"], $muu["x"], $muu["y"], imagecolorallocatealpha($kuva, $muu["r"], $muu["g"], $muu["b"], $muu["haalistuma"] / 2), $fontti, $muu["teksti"]); } imagepng($kuva, $kuvafilu); // heitetään kuva perusulostulon sijasta filuun imagedestroy($kuva); // ja logitetaan se mysql_query("INSERT INTO $taulunnimi (aika, ip, koko, kulma, x, y, r, g, b, haalistuma, teksti) VALUES ('$_aika', '$_remote_ip', '$tekstin_koko', '$kulma', '$x', '$y', '$väri_r', '$väri_g', '$väri_b', '0', '$teksti');"); header("Location: index.php"); // hus pääsivulle pois vek include "ala.php"; ?> *** HOX! eri filu! *** hinkkaa.php <?php $otsikko = "Vessanseinäsimu"; include "tiadot.php"; // hinkkaa putsausrätillä seinää $muut = mysql_query("SELECT * FROM $taulunnimi;"); if (mysql_num_rows($muut)) { // jos löytyy viestejä niin putsitaan teekuva(); // haalistutetaan ja poistetaan liikaa haalistuneet mysql_query("UPDATE $taulunnimi SET haalistuma = haalistuma + $paljonks_haalistuu_kerralla;"); mysql_query("DELETE FROM $taulunnimi WHERE haalistuma = 255;"); while ($muu = mysql_fetch_assoc($muut)) // piirretään ne imagettftext($kuva, $muu["koko"], $muu["kulma"], $muu["x"], $muu["y"], imagecolorallocatealpha($kuva, $muu["r"], $muu["g"], $muu["b"], $muu["haalistuma"] / 2), $fontti, $muu["teksti"]); imagepng($kuva, $kuvafilu); // heitetään kuva perusulostulon sijasta filuun imagedestroy($kuva); } header("Location: index.php"); // pääsivulle pois include "ala.php"; ?>
admin.php
<?php $otsikko = "Vessanseinäsimu - admin"; include "tiadot.php"; if (!$_ADMIN_LOGGED) echo "<p>Sori, vain adminille</p>"; else { // varmistetaan taulun olemassaolo. avaa tää skripti iha ekana ja sitten voit kommentoida ton pois vaik mysql_query("CREATE TABLE IF NOT EXISTS $taulunnimi (id INT NOT NULL AUTO_INCREMENT, aika CHAR(10), ip CHAR(15), koko TINYINT UNSIGNED, kulma SMALLINT, x SMALLINT, y SMALLINT, r TINYINT UNSIGNED, g TINYINT UNSIGNED, b TINYINT UNSIGNED, haalistuma TINYINT UNSIGNED, teksti VARCHAR(32), PRIMARY KEY (id));"); $kueri = mysql_query("SELECT * FROM $taulunnimi ORDER BY aika;"); if (mysql_num_rows($kueri) == 0) echo "<p>Ei yhtään raapustusta</p>"; else { $poistettavat = $_POST["ne"]; if ($_POST["jokane"] == 1) { // tapetaa kaikki pois husvek kuuseen mysql_query("TRUNCATE TABLE $taulunnimi;"); // säilytetää yhteensopivuus alemman tarkistuksen kanssa $kueri = mysql_query("SELECT * FROM $taulunnimi;"); // ja myös päivitetään kuva tyhjäks teekuva(); imagepng($kuva, $kuvafilu); // päivitetään kuvafilu imagedestroy($kuva); } elseif (isset($poistettavat)) { // jos adminoitu niin katellaan mitä tehdään // tehdään täysin uus kuva ja heitetään siihen ei-poistettavat tekstit teekuva(); // käydään läpi jokainen teksti ja katotaan onko sitä poistettavat-listassa while ($teksti = mysql_fetch_assoc($kueri)) { $jeh = array_search($teksti["id"], $poistettavat); if ($jeh === false) // ei poistettavat-listassa, joten piirretään se kuvaan imagettftext($kuva, $teksti["koko"], $teksti["kulma"], $teksti["x"], $teksti["y"], imagecolorallocatealpha($kuva, $teksti["r"], $teksti["g"], $teksti["b"], $teksti["haalistuma"] / 2), $fontti, $teksti["teksti"]); else // kuoletetaan pois mysql_query("DELETE FROM $taulunnimi WHERE id = '$teksti[id]';"); } imagepng($kuva, $kuvafilu); // päivitetään kuvafilu imagedestroy($kuva); // tiedot varmaan muuttuneet, joten haetaan uusiks ne $kueri = mysql_query("SELECT * FROM $taulunnimi;"); } if (mysql_num_rows($kueri) == 0) echo "<p>Ei yhtään raapustusta</p>"; else { echo "<form action=\"$_sivu_itse\" method=\"post\"><p>Valitse poistettavat<br />"; while ($teksti = mysql_fetch_assoc($kueri)) // näytetään tiedot ja poistoloota echo "<input type=\"checkbox\" name=\"ne[]\" value=\"$teksti[id]\" />" . htmlspecialchars($teksti["teksti"]) . " (" . date("d.m.Y H:i:s", $teksti["aika"]) . " $teksti[ip])<br />"; echo "<input type=\"checkbox\" name=\"jokane\" value=\"1\" />Tapa kaikki <input type=\"submit\" value=\"okkatirallaa\" /></p></form>"; } } } include "ala.php"; ?>
yla.php
<?php function iipee () { // jee napataa ibbe talteen kanssa :o if ($_SERVER["HTTP_X_FORWARDED_FOR"]) return $_SERVER["HTTP_X_FORWARDED_FOR"]; elseif ($_SERVER["HTTP_CLIENT_IP"]) return $_SERVER["HTTP_CLIENT_IP"]; else return $_SERVER["REMOTE_ADDR"]; } $_ADMIN_PASSU = "(tähän md5-hashi adminin passusta)"; $_MYSLI = @mysql_connect(/* hah, mun käyttämät sensuroitu */); if ($_MYSLI) $_MYSLI = (bool)mysql_select_db(/* ja tähän sit tietokanta */); $_aika = time(); $_remote_ip = iipee(); // omg, saitte selville mun sivujen adminhallintasysteemin, pelottavaa :o kai tän vois paremminki tehä emt $adminpostipassu = $_POST["login_passu"]; // sisään pääsee tyyliin typettämällä selaimeen urliks sivu.php?admin_in if (isset($_GET["admin_in"])) $admininhommat = "<form method=\"post\" action=\"$_SERVER[PHP_SELF]\"><p><input type=\"password\" name=\"login_passu\" /></p></form>"; if (isset($_GET["admin_out"])) { setcookie("admin_logged", "", 0); $_ADMIN_LOGGED = false; } if (isset($adminpostipassu)) { if (md5($adminpostipassu) == $_ADMIN_PASSU) { setcookie("admin_logged", $_ADMIN_PASSU, false); $_ADMIN_LOGGED = true; } else $admininhommat = "<p>väärä passu, sori</p>"; } elseif ($_COOKIE["admin_logged"] == $_ADMIN_PASSU) $_ADMIN_LOGGED = true; if ($_ADMIN_LOGGED) $admininhommat = "<p><a href=\"$_sivu_itse?admin_out\">admin ulos</a></p>"; ob_start(); // header()-helpotusta // ja sivun headerit echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fi\"> <head><title>$otsikko</title><meta http-equiv=\"Content-Type\" content=\"application/xhtml+xml; charset=iso-8859-1\" /> </head><body><h1>$otsikko</h1>$admininhommat"; ?> *** HOX! eri filu! *** ala.php <?php // ja suljetaan sivut nätisti if ($_MYSLI) mysql_close(); echo "</body></html>"; ob_end_flush(); ?>
Mikä vika siinä flat-filessä oli?
Koodiin vois tunkee hieman rivinvaihtoja selkeyttämään, jostain kumman syystä alkoi päätä särkemään :P
Vaikealukuista koodia jotenkin, voi olla juu et noi rivivaihdot (..niiden puuttumine) vähä kiusas.
Ota kuva koulus vessasta ja laita se kuva tohon taustaks ja koodaa et ne viestit menee siihen "seinälle" ja perspektiivi menee oikein.
Vaikealukuisuus saattaa johtua vaik siitä että jotkut rivit on niin pitkiä, olen tottunut käyttämään tätä isoa resoa (UXGA) hyödyksi. Selainhan rivittää noi. Kopsikaa editoriin ja tekstin automaaginen rivitys pois. Ja saahan ne rivinvaihdot iteki lisätä sinne. :)
Ja Meitsi: ei nyt huvita, tääki käy ihan mainiosti.
sooda kirjoitti:
Vaikealukuisuus saattaa johtua vaik siitä että jotkut rivit on niin pitkiä, olen tottunut käyttämään tätä isoa resoa (UXGA) hyödyksi.
Sellainen on kiva harrastus että ei tee riveistä vaikka 80 merkkiä pitempää vaikka olisikin iso resoluutio. :p
ois kiva jos aina pyyhkäsyn yhteydessä n. 10 pikseliä vessanseinästä menis pysyvästi yhden sävyn verran harmaaks :D
Ja sitten admin-paneelista voisi mukauttaa seinän harmaita spotteja... :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.