Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Graafinen vessanseinäsimu kakkone

Sivun loppuun

sooda [29.03.2005 17:38:00]

#

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();
?>

T.M. [31.03.2005 14:36:47]

#

Mikä vika siinä flat-filessä oli?

Koodiin vois tunkee hieman rivinvaihtoja selkeyttämään, jostain kumman syystä alkoi päätä särkemään :P

chiqu [02.04.2005 09:43:51]

#

Vaikealukuista koodia jotenkin, voi olla juu et noi rivivaihdot (..niiden puuttumine) vähä kiusas.

Meitsi [03.04.2005 15:29:30]

#

Ota kuva koulus vessasta ja laita se kuva tohon taustaks ja koodaa et ne viestit menee siihen "seinälle" ja perspektiivi menee oikein.

sooda [04.04.2005 11:52:59]

#

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.

Gwaur [13.04.2005 21:03:57]

#

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

moptim [01.10.2006 08:50:20]

#

ois kiva jos aina pyyhkäsyn yhteydessä n. 10 pikseliä vessanseinästä menis pysyvästi yhden sävyn verran harmaaks :D

moptim [23.05.2007 15:46:40]

#

Ja sitten admin-paneelista voisi mukauttaa seinän harmaita spotteja... :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta