handle na bazu je globalan

...jer čemu. sqlite radi proper locking.
query *nikad* ne konstruiraš string operacijama

...jer se netko, negdje zove "Robert'); DROP TABLE Students; --"
netko je otkrio @staticmethod!

...i drago nam je. možda iskopaš i @classmethod.

ali ni tamo gdje zaista postoje statičke metode nije jasno čemu bi zapravo
služile. ako imaš funkciju, i ona *nema* veze sa nekim objektom, ni sa kojim
objektom, zašto ju ne ostaviti kao jednostavnu funkciju? u javi imaš statičke
metode jer ne postoje jednostavne funkcije. time gore za javu.

p.s. nikad u životu nisam našao zanimljivu primjenu @staticmethod u py :)
crknite, magični indeksi!

...b/c tmp[-1] ne znači ništa.
prvi problemi - how do i socket

socket.recv (n) ti daje najviše n bajtova iz tcp buffera. on može imati manje
bajtova ili više. ako su poruke koje dolaze puno manje od n, svaki sukcesivni
recv (n) prima iduću poruku. ali nisu. neke su puno veće. onda sa prvim recv-om
pokupiš prvih n bajtova poruke, a sa narednim počneš čitati ostatak --
pretpostavljajući da je to nova poruka! to se vidi na motd-headeru, i vjerojatno
je razlog što se prog krši na našem kanalu.

jedan način je da u petlji zoveš recv (n) dok ne vrati nešto što je krače od n.
to znači da si iscjedio buffer, sve to spojiš i imaš sve što je do tog trena
stiglo. ali ni to baš ne radi - ako ti server šalje duge poruke, postoje
trenutci kada tvoj buffer ima > n bajtova spremnih za čitanje, ali ni to nije
cijela poruka!  ostatak naprosto još nije stigao.

ovo je ogroman problem i slabost stream (tcp) socketa. jedan način da se nosiš
sa time da pozivajući recv nemaš blage jesi li dobio punu poruku je da se kod
samog primanja pobrineš da imaš cijele linije. to radi za line-orijented,
tekstualne protokole. to sam i napisao: recvlines prvo iscjedi buffer, onda se
pobrine da ako zadnja linija nije stigla cijela, zapamti prefiks za kasnije.
output bi trebao biti jasan.
naah, zajebavam se :)

skužio si da je raniji commit sranje, zar ne? :D

jadan IRC objekt zbilja nema nikakve veze sa uskim zadatkom čitanja sukcesivnih
linija. i nema nikakve potrebe da dobije još jednu member varijablu. ako ga
previše okitimo pizdarijama, izgledati će kao nespretna božična jelka, skupa sa
vršnim ukrasom u obliku javinog logotipa.

separation of concerns princip. čitalica linija naprosto živi sama. ali da to
postigne, negdje treba pamtiti taj suvišak, rep prethodnog recv-a. da smo u
c++-u, javi čak, to bi bio poseban mali objekt i zvao bi se "iterator". to je
naravno u kurcu jer je tl;dr.

ne znam znaš li ih koristiti, ali irclines je pythonov "generator". funkcija
koja u sebi ima "yield" može puno puta završiti: svaki put kad naleti na yield,
snimi svoje stanje i vrati rezultat, a nakon toga može nastaviti iza yielda kao
da se ništa nije desilo. nastavlja sa .next(), ali "for" ftw.
dualnost

lines beget unlines
right

for ionako ne završava

additionally, kako oko njega nema "while True", exception handler ne treba
brutalan sys.exit.
stvarno mi je žao

... znam, dosta je bezobrazno reindentati tuđi kôd, ali nisam ga više mogao
gledati. uostalom, python guidelines predlažu da ne koristiš tabove nego space,
i to samo 4 po nivou. sry. sry.

(ako koristiš vim, sam bi ti trebao pokupiti teh right way iz zadnje linije)
housekeeping
protocol, let's extract it
across the cocksicle

wat

no, irc parser
some of the reply decode capabilities
use the proper protocol

my work here is done :)
finnish it up

WIT SOME SWEDES

Toliko od mene. Imaš kakav-takav IRC protokol i nekakav mehanizam primanja
naredbi. Take it away, champ!
Merge pull request #1 from pqwy/master

e buraz