Prakticky s MySQL - 12. díl

Jak na chat, to je přesně náplní dnešního dílu – budeme se zabývat opět převážně praktických plánováním aplikací v rámci systému MySQL, ale podrobně si popíšeme každou skulinku při budování kvalitního chatu po této stránce.

Chaty

Jednou z nejnávykovějších a zároveň nejoblíbenějších službou na internetových serverech jsou také chaty. Při konstrukci diskuse nás to tolik ještě nepálilo, ale u chatu je již na místě zásadní otázka: „Stojí nám vývoj chatu za to?“ Odpověď můžeme hledat především ve vlastních zdrojích. Při každém vývoje aplikace v rámci kombinace PHP a MySQL je vhodné uchýlit se někdy k open source materiálům, tedy volně dostupným zdrojovým kódům, které stačí upravit dle našeho přání a využít. Toto platí zejména v případě, že někdy nevíme „jak z toho“, nebo naopak víme, že vývoj aplikace bychom nemuseli optimálně zvládnout. Případ chatu je přesně tímto případ.

První možností tedy je využít již hotových systémů, které se šíří přímo na principu poskytování zdrojového kódu (www.phpnuke.org). Další alternativou je obdobně poskytovaná služby, kdy již ovšem nemáme přístup ke zdrojovým souborům, ale pouze exportním nastavením, barevnému schématu apod.

Pokud takovouto aplikace chceme získat coby zadavatel projektu, je pro nás navíc možná alternativa „pronájmu“ služby u některého z osvědčených poskytovatelů, nejnavštěvovanější české chaty mají jako pevnou součást své obživy právě komerční poskytování chatovacích místností zájemcům, nebo i úpravy a instalaci svého chatu na serveru klienta. Pokud se budeme bavit o tvorbě nového chatu, tuto možnost můžeme rovnou zavrhnout:).

Co kde je a proč?…

Pravděpodobně každý někdy již zabrousil na chat a dokáže si živě představit základní model, který zde slouží ke komunikaci. Uživatel píše zprávy ostatním uživatelům. Dalším stupněm je psaní vzkazů konkrétním uživatelům. Před výčtem všech možných i nemožných specifik běžného chatu je ovšem důležité probrat ještě jeden pohled na věc – jak chat vůbec využít. Pokud bychom si totiž chtěli udělat chat tzv. „sami pro sebe“, mohl by se z něho velice snadno stát pasivní chat, na němž nikdy nikdo nechatuje. Zabránit tomu lze správným zacílením chatu – do konkrétní komunity která si ho žádá.

Do značné míry již vyčerpanou volbou je také snažit se chat ozvláštnit něčím jiným. Nejeden internetový fanoušek již navrhoval ve své relativní mladické nerozvážnosti udělat chat se vším všudy, kde si přijdou na své všichni, nebo uživatelsky extrémně komfortní chat apod. Uvědomme si tedy několik základních problémů – český internet je již chaty zahlcen. Pokud má náš chat získat nové uživatele, bude je tedy asi přebírat zavedeným chatům. Toho ale nemůžeme tím,že se chatu přibližně vyrovnáme docílit. Proto začíná rozhodovat na jedné straně nabídka služeb, někdy originalita provedení, ale pro opravdu převratný chat by dnes již muselo být vyvinuto něco hodně EXTRA.

Z čeho tedy chat může být tvořen?

Pojďme si tedy odpovědět, co všechno chat může skýtat pro návštěvníky. Komunikace mezi uživateli musí vše spojovat, takže může být veřejná a soukromá. Může probíhat v jednom nebo více oknech po vzoru operátorů a lá ICQ. Uživatelé mohou používat grafické smajlíky – český ekvivalent je opravdu příznačný a frekventovaný i mezi laiky – emotikony;-). Čili grafické vyjádření aktuální citového rozpoložení.

Dále si v rámci místnosti mohou hrát uživatelé na pány a kmány:) – udělují si práva podle kterých mohou manipulovat s ostatními uživateli (vyhazovat je z chatu, dělat z nich neviditelné blby apod.). Ze základních vlastností chatu je nutno nezapomenout na uživatelsky komfortní a nastavitelný design reprezentovaných dat.

Pokud se budeme bavit o dalším stupni chatů, budou to opět jako u diskusí místnosti. Ty mohou uživatelé zakládat, zpřístupňovat je vybraným uživatelům či nastavit v nich jazyk. Co je ovšem podstatné je, že takovéto funkce může mít dnes pořád v podstatě každý. Proto jsou tu další inovační cesty – zvukové emotikony, seznamy uživatelů, s nimiž můžeme komunikovat i přes jiné místnosti a tak by šlo pokračovat až k dalšímu extrému, totiž sjednocování služeb pod hlavičkou chatu. Z tohoto pohledu mohou uživatelé chatovat a hrát při tom piškvorky, sbírat body za chatování a využívat pak dalších výhod například.

Kdo se v tom má vyznat?

Teď je na místě otázka: „Ale co já s tím?“ – a odpověď se vrací k prvnímu odstavci – pokud nám vývoj chatu opravdu stojí za tu námahu, budeme ho s větší pravděpodobností chystat komerčně a s uživatelsky definovanými službami a možnostmi. Opět se tedy podíváme na postupný návrh celého našeho chatu po tabulkách tak, aby náš vývoj měl na čem stavět. Začneme s základem chatu, totiž jeho uživateli a postupně si projde celý jeho chod poměrně podrobně.

Uživatelé chatu

CREATE TABLE chat_people (
  id integer unsigned primary key NOT NULL auto_increment,
  name varchar(40) NOT NULL,
  password varchar(40) NOT NULL,
  status integer unsigned NOT NULL DEFAULT 0,
  logged integer unsigned NOT NULL DEFAULT 0,
  date DATETIME NOT NULL DEFAULT `0000-00-00 00:00:00`)

Klepněte pro větší obrázek

Nyní si popíšeme, co jsme vlastně výše vytvořili a na co. Základní automaticky narůstající pole je unikátní identifikátor a primární klíč celé tabulky, id. Druhou položkou bude jméno uživatele, resp. přezdívka – nick, při e-logování se používá i výrazu login. Položka heslo je pro zabezpečení uživatele jednoznačná. Dále máme příznakovou položku status, ta bude určovat uživatelská práva.

Do pole logged zadáme aktuální uživatelův stav – vyhozen z místnosti, není aktivně přítomen v systému, je to neviditelný blb, nebo třeba správce místnosti. Poslední položka date bude sloužit k ověřování toho, zda je uživatel právě aktivní a kdy naposledy porváděl jakoukoliv operaci na chatu – při každé se mu zde zapíše přesný časový údaj. Lze takto snadno spočítat, zde je momentálně podle naší konstanty aktivnosti na chatu nebo ne dle časové odezvy od posledního napsaného příspěvku.

Registrace uživatele

SELECT count<) AS count FROM chat_people WHERE lower(name) = lower(`$name`)
if (($RESULT->count == 0) && ($password == $password2)) {
  INSERT INTO chat_people VALUES (NULL, `$name`, `$password`, 0, NOW());
};

Při registraci uživatele tedy potom zjistíme, zda uživatelovo jméno ($name) již v databázi není. Pokud ne, a případně se jeho registrační hesla shodují, potom vložíme do tabulky uživatelů nový záznam. Všimněte si také funkce NOW, které zapíše časový údaj.

Přihlášení uživatele

SELECT * FROM chat_people WHERE name=`$name`
if (($RESULT) && ($password == $RESULT->password)) {
  UPDATE chat_people SET date=NOW() WHERE id = $RESULT->id
}

Při přihlašování uživatelů se nejprve ověří správnost jím zadávaných přihlašovacích údajů a pokud odpovídají záznamu v tabulce, potom se u takovéhoto záznamu změní uživatel na aktivního chataře a změní se mu i položka date.

Odhlášení uživatele

UPDATE chat_people SET logged=0 WHERE id = $from

Při odhlašování uživatelů pouze změníme jeho status a již nebude aktivním chatařem.

Generování seznamu přihlášených uživatelů

SELECT id,name FROM chat_people WHERE (logged = 1) AND (date >= NOW() - INTERVAL $time_limit MINUTE)

Pokud bychom chtěli umožnit výpis aktuálně chatujících lidí, můžeme pracovat i s proměnlivou hodnotou časového intervalu $time_limit od doby vypsání posledního příspěvku u uživatelů, kteří sami neopustili chat.

Vyhazování neaktivních uživatelů z místností

SELECT IF(date >= NOW() - INTERVAL $time_limit MINUTE, 0, 1) AS logout FROM chat_people WHERE id = $from

Pokud zjišťujeme, zda je uživatel ještě aktivním, stačí nám spočítat onen časový interval mezi posledním příspěvkem a aktuální časem.

Zprávy

CREATE TABLE chat_texts (
  id integer unsigned primary key NOT NULL auto_increment,
  people1 integer unsigned NOT NULL,
  people2 integer unsigned NOT NULL DEFAULT 0,
  text text NOT NULL,
  date DATETIME NOT NULL DEFAULT `0000-00-00 00:00:00`)

Klepněte pro větší obrázek

Co dalšího nám zatím chybí jsou zprávy psané na chatu. Opět začneme popis naší tabulky identifikačním číslem. Na to navážeme identifikační číslo uživatele, který odesílá příspěvek a číslo uživatele, kterému je příspěvek určen – jedná-li se o nulu je veřejný. Samotný text příspěvku opět můžeme doplnit o jeho časové zařazení.

Vkládání příspěvku

INSERT INTO chat_texts VALUES (NULL, `$from`, `$to`, `$text`, NOW())
UPDATE chat_people SET date=NOW() WHERE id = $from

Při vkládání příspěvku nejprve vložíme do tabulky požadovaná data a následně změníme časovou nálepku píšícímu uživateli. Zde by bylo vhodné zmínit, že pokud náš chat obsahuje i virtuální serverové hlášení, které generujeme a vkládáme do tabulky příspěvků, pak může být pro něj zvoleno číslo uživatele jako 0.

Zobrazení příspěvků

SELECT chat_texts.*, chat_pople.name FROM chat_texts LEFT JOIN chat_people ON chat_texts.from=chat_people.id WHERE date >= NOW() - INTERVAL $time_limit MINUTE ORDER BY date DESC

Při výpisu příspěvku z chatu se již dostáváme k o něco složitějším SQL dotazům, ale věřím, že jeho popis vám ho opět více zpřístupní. Zvolíme všechny položky z tabulky zpráv a jména uživatelů z k tomu určené tabulky, zaměníme pro výpis identifikátor uživatele za jeho jméno u všech příspěvků, které byly napsány za danný interval minut. Při frekventovaných chatech se samozřejmě toto neřeší, pouze se nastavuje LIMIT pro listování v příspěvcích – nám jde zde jen o to, aby se nevypisovaly i rok staré příspěvky:).

Smajlíky

CREATE TABLE chat_smilees (
  id integer unsigned primary key NOT NULL auto_increment,
  code varchar(40) NOT NULL,
  image varchar(255) NOT NULL,
  key (code))

Klepněte pro větší obrázek

Základní operace chatu jsme si již vysvětlili, nyní se podíváme jak by se dal řešit systém smajlíků, které by se vkládaly do textu místo některých definovaných značek - *s15*, :-) apod. Uložili bychom si tedy do tabulky kód, za který smajlíka použijeme a jméno souboru, který poté vložíme do stránky.

Používání smajlíků

SELECT * FROM chat_smilees ORDER BY LENGTH(code) DESC

Pokud bychom smajlíky chtěli porovnat s textovým řetězcem, který by mohla zpráva k vypsání obsahovat, není nic jednoduššího než si je postupně všechny podle délky vybrat (aby se nepoužil smajlík :) místo :)) ).

Místnosti

CREATE TABLE chat_rooms (
  id integer unsigned primary key NOT NULL auto_increment,
  people integer unsigned NOT NULL,
  name varchar(40) NOT NULL,
  whispering integer unsigned NOT NULL DEFAULT 0,
  date DATETIME NOT NULL DEFAULT `0000-00-00 00:00:00`)

Klepněte pro větší obrázek

V případě, že bychom chtěli používat i systém s místnostmi, taková tabulka by byla opět jeho základem. Obsahuje identifikátor zakládajícího uživatele, svoje jméno a stav šeptání v místnosti spolu s datem vzniku. Aby takovýto systém mohl fungovat, museli bychom ještě do tabulky chat_texts doplnit sloupec room, jenž by obsahoval identifikátor, do jaké místnosti má zpráva jít. Posledním bonusem by pak mohlo třeba být, že nebyla-li by místnost vyplněná, jednalo by se o mezimístnosťovou zprávu a ta by se vypsalo uživateli v té místnosti, ve které by naposledy promluvil (tj. v nejbližším časovém intervalu).

Za týden

Po dnešním takřka heroickém výkonu při plánování celého systému chatu si může každý uživatel již s trochou práce chat sám doprogramovat, my se již příští týden věrni rubrice MySQL detailněji podíváme na datum a čas v MySQL!

Diskuze (1) Další článek: Vláda prodá Český Telecom za 55 miliard korun

Témata článku: Software, Programování, Open source, Code, Šeptání, Originalita, Aktivní uživatel, Uživatelé, From, Celá místnost, Základní popis, Nick, Select, MySQL, Díl, Jednoznačná odpověď, Status, Order, Apod, Chata, Default, Místnost, Password, Příspěvek, Nová přezdívka


Určitě si přečtěte

Podívejte se, jak vypadá mikrofon nebo blecha pod elektronovým mikroskopem

Podívejte se, jak vypadá mikrofon nebo blecha pod elektronovým mikroskopem

** Z Brna pochází třetina světové produkce elektronových mikroskopů ** První československý kus vyrobila Tesla už v 50. letech ** Dnes na ni navazuje třeba brněnský Tescan

Jakub Čížek | 19

Už desítky let se pokoušíme odposlouchávat mozek. Rusům se podařil kousek, ze kterého vám spadne brada

Už desítky let se pokoušíme odposlouchávat mozek. Rusům se podařil kousek, ze kterého vám spadne brada

** K odposlechu mozků používáme EEG ** To má ale žalostné informační rozlišení ** Rusům pomohla počítačová neuronová síť

Jakub Čížek | 29


Aktuální číslo časopisu Computer

Megatest: 20 powerbank s USB-C

Test: mobily do 3 500 Kč

Radíme s výběrem routeru

Tipy na nejlepší vánoční dárky