Close
Faqja 0 prej 2 FillimFillim 12 FunditFundit
Duke shfaqur rezultatin -19 deri 0 prej 21
  1. #1
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    Një klient IRC në Java

    Vendosa te germoja ne ca projekte te mia te vjetra me te cilat i kam bere ne fillimet e mia si programues dhe ne vazhdim.
    Besoj se mund te jene te nevojshem per thellimin e njohurive per ata qe jane te rinje ne fushen e programimit po pse jo dhe atyre te avancuarve perderisa projektet perfshijne fusha te ndryshme te teknologjise.

    Sot po postoj nje program ne gjuhen Java , nje klient IRC(Internet Relay Chat) i bere para 3 vitesh si nje permbledhje e te gjitha njohurive qe kisha atehere.

    Perpara se te mund te kuptohet kodi i ketij programi relativisht te vogel duhen keto njohuri paraprake:

    Njohja e mire e gjuhes Java, ne veçanti pak njohuri mbi Thread, Socket, dhe ndertimin e nderfaqeve grafike me Swing.
    Meqenese kemi te bejme me implementimin e nje protokolli komunikimi si IRC
    duhen njohurite baze te protokollit IRC(RFC1459) te cilin po e jap si bashkangjitje ne kete postim dhe mund te shkarkohet ketu.
    Leximi dhe analizimi i kodit do lehtesohej mjaft nese perdorni nje IDE(Integrated Development Environment) Java te viteve te fundit.
    si Eclipse, IntilliJIDEA, etj etj.

    Ne figuren me poshte eshte skema e varesive mes klasave te ketij projekti.
    Me varesi nenkuptoj perdorimin e nje klase prej nje klase tjeter.
    Organizimi dhe ndarja e detyrave mes klasave eshte e tille qe tre shtresat kryesore te programit te jene te ndara llogjikisht nga njera tjetra , kjo e ben me te lehte mirmbajtjen , leximin dhe evulimin e kodit.

    Dallojme Nderfaqen grafike qe shfaq mesazhet dhe ofron elementet grafike te nevojshem per nderveprimin mes perdoruesit dhe programit.
    Dallojme shtresen e llogjikes se IRC, ku ndodhet implementimi i protokollit dhe ne fakt zemra e programit.
    Dallojme ne fund gjithashtu shtresen e komunikimit ne nivelin TCP/IP.

    Me tej po jap kodin e ç'do klase te cilat jane te komentuara ne ç'do pjese te kodit.

    Kodi eshte i vlefshem per java version 1.4 e me lart.
    Fotografitë e Bashkëngjitura Fotografitë e Bashkëngjitura  
    Fotografitë e Bashkëngjitura Fotografitë e Bashkëngjitura

  2. #2
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    Parser.java

    Kodi PHP:
    /*
    * Parser.java
    *
    * @author xfiles
    *
    * Kjo klase perben objektin i cili ofron metoda te nivelit te larte per copetimin e mesazheve
    * te serverit dhe nxjerrjen e komandave dhe parametrave per perdorimin e tyre.
    * Ky objekt njeh vetem klasen Administruesi per ti derguar mesazhe gabimi ne rast te
    * NullPointerException te hedhur nga StringTokenizer.
    */
    import java.util.*; //importojme java.util.* sepse do te perdorim StringTokenizer

    public class Parser {
        private final 
    Administruesi admin//per te njohur nje reference te Administruesit

        /*
        * Konstruktori Parser i cili merr si parameter nje ndryshore te tipit Administruesi
        * meqenese ky objekt krijohet nga vete Administruesi atehere vete administruesi
        * jep si parameter veten e tij te perfaqesuar nga 'this'
        */
        
    public Parser(Administruesi admin) {
            
    this.admin=admin;
        }

        
    /*
        * Metoda publike merrLlojinEMesazhit sherben per te percaktuar llojin e mesazhit qe vjen nga serveri
        * normalisht kemi tre grupe te medha. Komandat e serverit (me duket se ka vetem nje) ,
        * si psh "PING :2D34F5EA"
        * mesazhet e serverit qe karakterizohen nga komanda numerike
        * si psh ":Serveri!perdoruesi@adresaIP 353 destinacioni :mesazhi bla bla bla"
        * mesazhet qe dergon serveri per te lajmeruar largimin ,hyrjen e perdoruesve ose
        * per dergimin e mesazheve private dhomes ose nje personi si psh
        * ":derguesi!perdoruesi@adresaIP PRIVMSG #shqiperia java_programer :ckemi"
        * etj etj.
        * dhe kthen nje String si emer te llojit te mesazhit
        * "KLIENT" per mesazhet e komunikimit midis klienteve ose lajmerimet per largim etj
        * "SERVER" mesazhet qe kane karakteristike komanden me numra treshifrore
        * "KOMANDE" ne rast se eshte komande por ne te vertete vetem nje komande ka.
        */
        
    public String merrLlojinEMesazhit(String msg){
            
    String rez="KLIENT";    //si fillim e zeme se mesazhi eshte i tipit KLIENT
            
    try{
                
    StringTokenizer copetuesi=new StringTokenizer(msg);
                if(
    msg.charAt(0)!=':'rez="KOMANDE";  //nese nuk fillon me ':' atehere nuk eshte mesazh

                //perpara se te kalojme ne nextToken kontrollojme qe ka te tjere
                //qe te parandalojme NullPointerException
                
    if(copetuesi.hasMoreTokens()) copetuesi.nextToken();

                
    //nese fillon me ':' dhe ka akoma tokens
                
    if(msg.charAt(0)==':' && copetuesi.hasMoreTokens()){

                    
    //nese ka nje komande me 3 germa me siguri eshte numri 3 shifror
                    //(sepse komanda me 3 germa nuk ka) atehere eshte mesazh SERVER
                    
    if(copetuesi.nextToken().length()==3){ rez="SERVER";

                    }else 
    rez="KLIENT";    //perndryshe eshte KLIENT
                
    }
            }catch(
    NullPointerException npex){

                
    //Nese ndeshim ne nje NullPointerException
                //perdorim metoden publike gabim(String str) te Administratorit
                //qe te raportojme gabimin.
                //Nese ndodh nje exeption atehere threadi i Administratorit ndalon keshtu qe jemi
                //te deturuar te lidhemi perseri.
                
    admin.gabim("**Gabim fatal duke lexuar mesazhet e serverit! Kthehuni dhe lidhuni perseri!***");
            }
            return 
    rez;    //vlera e kthimit
        
    }

        
    /*
        * Kjo metode perdoret ne rast se lloji eshte KOMANDE per te marre komanden
        */
        
    public String merrKomanden(String msg){

            
    //kthejme direkt tokenin e pare te mesazhit
            
    return (new StringTokenizer(msg)).nextToken();
        }

        
    /*
        * Kjo metode perdoret per te marre derguesin e mesazhit ne rast se lloji eshte SERVER ose KLIENT
        */
        
    public String merrDerguesinEMesazhit(String msg){
            return (new 
    StringTokenizer(msg," :!")).nextToken();
        }

        
    /*
        * Ne rast se mesazhi eshte KLIENT ose SERVER kjo metode sherben per nxjerrjen e komande
        */
        
    public String merrKomandenEMesazhit(String msg){
            
    StringTokenizer copetuesi=new StringTokenizer(msg);

            
    //kalojme tokenin e pare duke kontrolluar se ka akoma
            
    if(copetuesi.hasMoreTokens()) copetuesi.nextToken();

            
    //gjithmone tokeni dyte eshte komanda e mesazhit ose numri i komandes se serverit
            
    if(copetuesi.hasMoreTokens()) return copetuesi.nextToken();

            
    //po qe se nuk ka asgje kthejme null, me kete problem do merret vete metoda qe e ka thirrur
            
    else return null;
        }

        
    /*
        * Ne rast se lloji eshte KLIENT perdoret per te kuptuar se kush eshte destinacioni.
        * gjithmone destinacioni jemi ose ne ose dhoma.nese jemi ne domethene se eshte mesazh privat.
        */
        
    public String merrDestinacioninEMesazhit(String msg){
            
    StringTokenizer copetuesi=new StringTokenizer(msg);
            if(
    copetuesi.hasMoreTokens()) copetuesi.nextToken();    //kalimet e zakonshme
            
    if(copetuesi.hasMoreTokens()) copetuesi.nextToken();    //-----||-------
            
    if(copetuesi.hasMoreTokens()) return copetuesi.nextToken();
            else return 
    null;
        }

        
    /*
        * Kjo metode sherben ne rast se eshte SERVER ose KLIENT per te marre mesazhin
        * e vertete qe serveri ose nje perdorues do te na dergoje
        */
        
    public String merrMesazhinEDerguesit(String msg){
            
    int pozicioni=msg.indexOf(" :")+2//gjejme pozicionin e mesazhit te vertete ne te gjithe mesazhin
            
    String rezultati="";        //vlera kthimit

            //duke filluar qe nga pozicioni i fillimit te mesazhit kopjojme vlerat
            //tek rezultati keshtu del vetem mesazhi i vertete i paster
            
    for(int i=pozicioni;i<msg.length();i++){
                
    rezultati+=msg.charAt(i);
            }
            return 
    rezultati;
        }



  3. #3
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    Komunikuesi.java

    Kodi PHP:
    /*
    * Komunikuesi.java
    *
    * @author xfiles
    *
    * Kjo klase krijon nje objekt qe na sherben me metoda te nivelit te larte per dergimin dhe
    * marrjen e mesazheve nga serveri.
    *
    */

    import java.net.*;    //do na sherbeje per klasen Socket dhe UnknownHostException
    import java.io.*;    //do na sherbeje per I/O dhe IOException


    public class Komunikuesi {

        private 
    Socket comSocket;        //Socket per komunikim
        
    private DataOutputStream out;    //Output stream per dergimin e mesazheve
        
    private BufferedReader in;        //nje objekt per marrjen e mesazheve me vija 'lines'
                                //meqenese ne protokollin IRC cdo mesazh mbaron me ciftin
                                //CR-LF(Carrige Return-Line Feed
        
    private final Administruesi admin;    //nje reference per njohjen e Administruesit te cilit
                                //do i raportojme gabimet.

        /*
        * Konstruktori qe merr si parametra Administrator,emrin e hostit dhe porten
        * Socket krijohet ketu per te eliminuar problemet qe mund te ndodhin gjate krijimit te saj
        * tek Administratori i cili luan nje rol kyc ne stabilitetin e programit ne pergjithesi
        */
        
    public Komunikuesi(Administruesi admin,String host,int port){
            
    this.admin=admin;
            if(
    host==null || "".equals(host) || port == 0) {
                
    admin.merruMeGabimFatal();
                return;
            }
            try{
                
    this.comSocket=new Socket(host,port); //krijojme Socket
                
    out=new DataOutputStream(comSocket.getOutputStream()); //krijojme output
                
    in=new BufferedReader(new InputStreamReader(comSocket.getInputStream())); //krijojme input
                
    if(this.comSocket==null || out==null){ //ne rast se objekti i perftuar eshte null
                    
    admin.gabim("***Lidhja nuk u krijua dot!***");
                    
    admin.merruMeGabimFatal();
                }
            }catch(
    IOException ioex){

                
    //ne rast gabimi I/O raportojme tek administruesi
                
    admin.gabim("**Gabim! I/O! Nuk munda te krijoj lidhje me Serverin !!!***");
                
    admin.merruMeGabimFatal();    //ekzekutojme gjerat e nevojshme ne rast gabimi
            
    }
        }

        
    /*
        * sherben qe administratori te kontrolloje nese socket ekziston apo jo perpara se te therrasi
        * metodat e meposhtme
        */
        
    public Socket merrSocket(){
            return 
    this.comSocket;
        }

        
    /*
        * nje metode publike qe i sherben Administruesit per njohjen e emrit te hostit ne menyre qe te
        * nxjerri adresen ip etj qe duhen per regjistrimin me serverin dhe dergimin e mesazheve
        */
        
    public String merrEmrin(){
            return 
    comSocket.getInetAddress().getHostName();
        }

        
    /*
        * e njejta gje si me siper
        */
        
    public String merrAdresenLokale(){
            
    String adresa="";
            try{
                
    adresa=""+new String(InetAddress.getLocalHost().getAddress());
            }catch(
    UnknownHostException uhex){
                
    admin.gabim("**Gabim! Server i panjohur!***");
                
    mbyll(); //mbyllim socket qe kemi hapur
                
    admin.merruMeGabimFatal(); //merremi me administrimin e gabimit
            
    }
            return 
    adresa;
        }

        
    /*
        * merr adresen , hostname
        */
        
    public String merrAdresen(){
            return 
    comSocket.getInetAddress().getHostAddress();
        }

        
    /*
        * dergon  mesazhet serverit duke i shtuar CR-LF ne fund te cdo mesazhi
        * eshte detyra e komunikuesit te merret me shtimin e CR-LF
        */
        
    public void dergo(String str){
            try{
                
    out.writeBytes(str);
                
    out.write(13);
                
    out.write(10);
            }catch(
    IOException ioex){
                
    admin.gabim("**Gabim! Nuk munda te dergoj mesazhin!Lidhja u nderpre!***");
                
    mbyll();
                
    admin.merruMeGabimFatal();
            }
        }

        
    /*
        * lexon nga inputi nje rresht dhe kthen nje String qe korrespondon me inputin
        */
        
    public String lexo(){
            
    String inputStr="";
            try{
                
    inputStr=in.readLine();
            }catch(
    IOException ioex){
                
    admin.gabim("**Gabim! !Lidhja u nderpre!***");
                
    mbyll();
                
    admin.merruMeGabimFatal();
            }
            return 
    inputStr;
        }

        
    /* Mbyll kanalin e komunikimit */
        
    public void mbyll(){
            if(
    comSocket!=null){
                try{
                    
    comSocket.close();
                }catch(
    IOException ioex){
                    
    //
                
    }
            }
        }



  4. #4
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    Administruesi.java

    Kodi PHP:
    /*
    * Administruesi.java
    *
    * @author xfiles
    *
    * Kjo eshte klasa qe kontrollon mesazhet,dritaret private, duke perdorur objektet
    * Komunikuesi,Parser,DritarePrivate dhe nderfaqen KlientiIRC
    * Kjo kalse eshte edhe thread meqenese implementon Runnable
    * kjo behet nga nevoja qe kemi te marrim vazhdimisht mesazhet e serverit dhe ti deshifrojme
    * gjate gjithe jetes se Administratorit
    */

     //importojme paketat e nevojshme

    import java.util.*;


    public class 
    Administruesi implements Runnable{
        private final 
    Komunikuesi komunikuesi;//deklarojme komunikuesin
        
    private Parser prs;                //deklarojme parserin
        
    private final  KlientiIRC parent;        //deklarojme prindin e Administartorit qe eshte nje KlientIRC
        
    private String user,nick,dhoma;    //deklarojme ndryshore per perdoruesin,pseudonimin,dhe dhomen
        
    private String id;                //nje string ku do memorizojme identitetin e lidhjes sone
        //qe do na duhet sa here te dergojme mesazhe.

        
    private final  Map dritaret=new HashMap();    //Nje objekt map ku mbajme dhe kontrollojme dritaret
        
    private final List listaBllokimit=new LinkedList(); //aty ku mbahen pseudonimet me te cilet nuk duam te flasim
        
    private boolean joinPOJO=false,runThread=false,ok=true;    //ndryshore booleane per kontroll

        /*
        * Konstruktori i cili ka si parameter nje objekt qe implementon KlientiIRC
        */
        
    Administruesi(KlientiIRC paren){
            
    this.parent=paren;
            
    parent.shkruaj("Duke u lidhur me serverin.....");

            
    //inicializojme komunikuesin
            
    komunikuesi=new Komunikuesi(this,parent.merrServerin(),parent.merrPorten());
        }



        
    /**
        * per te evituar gabimet ndaj null pointer exception ne rast se nuk krijojme dot nje komunikues
        * krijojme nje metode qe ben inicializimet e tjera nga parent vetem nese gjithcka ka shkuar mire
        */
        
    public void fillo(){
            
    //inicializojme ndryshoret e tjera
            
    user=parent.merrUser();
            
    nick=parent.merrNick();
            
    dhoma=parent.merrDhomen();

            
    runThread=true;    //lejojme qe ky thread te ekzekutohet
            
    id="!"+user+"@";    //inicializojme id
            
    Thread kjo = new Thread(this);
            
    kjo.start();//e nisim
            
    prs=new Parser(this);//parseri
            
    regjistroLidhjen();//regjistrojme lidhjen me serverin IRC
        
    }

        
    /*
        * per te kontrolluar gjendjen e adminit nga jashte
        */
        
    public boolean eshteOk(){
            return 
    ok;
        }

        
    /*
        * nje metode per te lejuar klasat e tjera te vizualizojne gabimet
        * pa e njohur klasen kryesore
        */
        
    public void gabim(String gstr){
            
    parent.shkruaj(gstr);
        }

        
    /**
        * Na lejon te kryejme operacionet e duhura ne rast gabimi qe mund te ndodhi
        * ne kete rast ndalojme ekzekutimin e threadit e cila nese vazhdon ben crash te gjithe aplikacionin
        * i cili nuk mund te lidhet me dhe krijon instabilitet
        */
        
    public void merruMeGabimFatal(){
            
    runThread=false;
            
    ok=false;
            
    mbaro();
        }

        
    /*
        * Kjo metode kryen hapat e nevojshem perpara se ta mbyllim administratorin
        * sa here qe
        */
        
    public void mbaro(){
            try{
                
    komunikuesi.mbyll();
                
    //this.finalize();
            
    }catch(Throwable t){
                
    //nuk bejme asgje ne rast gabimi
            
    }
        }

        
    /*
        * metode qe sherben per tu futur ne nje dhome me komanden JOIN
        */
        
    public void join(String dhomaRe){
            if(
    dhomaRe.charAt(0)!='#'dhomaRe="#"+dhomaRe//kontrollon nese emri i dhomes eshte i sakte
            
    this.dhoma=dhomaRe;    //axhornon ndryshoren e dhomes
            
    komunikuesi.dergo("JOIN "+dhomaRe);
        }

        
    /*
        * sherben per tu larguar nga dhoma
        */
        
    public void part(){
                
    komunikuesi.dergo("PART "+dhoma);
        }

        
    /*
        * dergon mesazh privat dhe merr si parametra emrin e destinacionit dhe mesazhin qe duam
        * ti dergojme
        */
        
    public void dergoMesazhPrivat(String destinacioni,String mesazhi){
            
    komunikuesi.dergo(":"+nick+id+komunikuesi.merrAdresenLokale()+" PRIVMSG "+destinacioni+" :"+mesazhi);
        }

        
    /*
        * sherben per tu shkeputur me serverin
        */
        
    public void quit(String msg){
            
    komunikuesi.dergo("QUIT :"+msg);
        }

        
    /*
        * sherben per te ndrruar nickun
        */
        
    public void nderroNick(String nickIRi){
            
    komunikuesi.dergo(":"+nick+" NICK "+nickIRi);
            
    nick=nickIRi;
        }

        
    /*
        * regjistron lidhjen
        */
        
    public void regjistroLidhjen(){
            
    komunikuesi.dergo("NICK "+nick);
            
    komunikuesi.dergo("USER "+user+" "+komunikuesi.merrEmrin()+" "+komunikuesi.merrAdresen()+" : Perdoruesi i DivjakaChat");
            
    komunikuesi.dergo("JOIN "+dhoma);
        }

        
    /*
        * dergon mesazh dhomes
        */
        
    public void dergoDhomes(String mesazhi){
                
    komunikuesi.dergo(":"+nick+id+komunikuesi.merrAdresenLokale()+" PRIVMSG "+dhoma+" :"+mesazhi);
                
    parent.shkruaj("<"+nick+"> "+mesazhi);
        }

        
    /*
        * Motorri qe mban gjalle administruesin
        * Vazhdimisht ekzekutohet
        */
        
    public void run(){
            
    //ndersa mund te vazhdoj te ekzekutoje
            
    while(runThread){

                
    //nese komunikuesi nuk eshte null se perndryshe del null pointer exception
                
    if(komunikuesi!=null){
                    
    //nese socketi i komunikuesit nuk eshte null
                    
    if(komunikuesi.merrSocket()!=null){
                        
    String msg=komunikuesi.lexo();    //lexo nje mesazh

                        //nese nuk eshte bosh therret metoden e specializuar per kete pune
                        
    if(!msg.equals("null") && !msg.equals("")) merruMeMesazhin(msg);
                    }
                }
            }
        }

        
    /*
        * kjo metode duke perdorur metoden merrLlojinEMesazhit() te klases
        * Parser identifikon llojin e mesazhit dhe e kalon ne metoda me te specializuara per ate
        * lloj mesazhi
        */
        
    public void merruMeMesazhin(String msg){
            if(
    prs.merrLlojinEMesazhit(msg).equals("KLIENT")){
                
    merruMeMesazheKlienti(msg);
            }else if(
    prs.merrLlojinEMesazhit(msg).equals("SERVER")) {
                
    merruMeMesazheServeri(msg);
            }else if(
    prs.merrLlojinEMesazhit(msg).equals("KOMANDE")) {
                
    merruMeKomanden(msg);
            }
        }

        
    /*
        * hap nje dritare private ne rast se jemi ne ata qe e kerkojme
        */
        
    public void hapMesazhPrivat(String destinacioni){

            
    //nese emri i listes qe kemi zgjedhur ka nje prefiks e injorojme dhe e filtrojme emrin
            
    if(destinacioni.charAt(0)=='@' || destinacioni.charAt(0)=='+' || destinacioni.charAt(0)=='&' || destinacioni.charAt(0)=='%'destinacioni=destinacioni.substring(1);

            
    //krijojme nje ndryshore ku memorizojme objektin e dritares qe e nxjerrim nga HashMap
            //duke perdorur si celes destinacionin
            //jep null nese nuk celesi nuk ekziston
            
    DritarePrivate priv=(DritarePrivate)dritaret.get(destinacioni);

            
    //meqenese jemi ne qe po kontaktojme nese pseudonimi ndodhet i bllokuar e zhbllokojme
            
    if(eshteBllokuar(destinacioni)) zhblloko(destinacioni);

            
    //nese ky objekt nuk eshte null
            
    if(priv!=null){

                
    //nese celesi nuk ekziston ose dritarja eshte e mbyllur
                
    if(!dritaret.containsKey(destinacioni) || (!priv.isVisible() && !priv.isDisplayable())){

                    
    //hap nje dritare te re per te biseduar
                    
    dritaret.put(destinacioni,new DritarePrivate(this,destinacioni,nick));
                }
            }

            
    //ndryshe do te thote qe ne HashMap nuk ka dritare me kete emer
            //dhe krijon nje te re
            
    else dritaret.put(destinacioni,new DritarePrivate(this,destinacioni,nick));
        }

        
    /*
        * kjo metode thirret ne rast se nga mesazhi serverit kuptojme se dikush po na dergon
        * nje mesazh privat
        */
        
    private void merruMeMesazhPrivat(String derguesi,String msg){
            
    DritarePrivate destinacioni;

            
    //nese emri i derguesit ka nje prefiks e injorojme dhe e filtrojme emrin
            
    if(derguesi.charAt(0)=='@' || derguesi.charAt(0)=='+' || derguesi.charAt(0)=='&' || derguesi.charAt(0)=='%'derguesi=derguesi.substring(1);

            if(!
    eshteBllokuar(derguesi)) {
                
    //kontrollojme nese ekziston nje dritare bisede me kete dergues
                
    destinacioni=(DritarePrivate)dritaret.get(derguesi);

                
    //nese nuk eshte null
                
    if(destinacioni!=null){

                    
    //nese ekziston nje dritare me kete emer derguesi
                    
    if(dritaret.containsKey(derguesi)){

                        
    //nese dritarja nuk eshte e mbyllur
                        
    if(destinacioni.isVisible() && destinacioni.isDisplayable()){

                            
    //perdorim kete dritare
                            
    destinacioni=(DritarePrivate)dritaret.get(derguesi);

                            
    //dhe vizualizojme mesazhin tek dritarja ekzistuese
                            
    destinacioni.shkruajMesazh(msg,derguesi);
                        }
                    }
                }

                
    //nese dritarja eshte null ose eshte e mbyllur
                
    if(destinacioni==null || !(destinacioni.isVisible() && destinacioni.isDisplayable())){

                    
    //krijo nje dritare te re
                    
    destinacioni=new DritarePrivate(this,derguesi,nick);
                    
    dritaret.put(derguesi,destinacioni); //ja shton HashMap
                    
    destinacioni.shkruajMesazh(msg,derguesi);    //vizualizon mesazhin
                
    }
            }
        }

        
    /*
        * Kjo metode eshte e specializuar ne mesazhet KLIENT
        * dhe per cdo lloj mesazhi te ketij tipi sipas komandes qe nxjerr kryen
        * punen e nevojshme
        */
        
    private void merruMeMesazheKlienti(String msg){

            
    //nese komanda eshte PRIVMSG
            
    if(prs.merrKomandenEMesazhit(msg).equals("PRIVMSG")){

                
    //nese destinacioni eshte i barabarte me dhomen
                
    if(prs.merrDestinacioninEMesazhit(msg).equalsIgnoreCase(dhoma)){
                    
    //vizualizon mesazhin tek dritarja kryesore
                    
    parent.shkruaj("<"+prs.merrDerguesinEMesazhit(msg)+"> "+prs.merrMesazhinEDerguesit(msg));
                }
                
    //perndryshe do te thote qe eshte mesazh privat dhe ja le punen
                //metodes se mesazheve private
                
    else merruMeMesazhPrivat(prs.merrDerguesinEMesazhit(msg),prs.merrMesazhinEDerguesit(msg));
            }

            
    //nese komanda eshte JOIN
            
    else if(prs.merrKomandenEMesazhit(msg).equals("JOIN")){

                
    //nese ai qe hyn ne dhome nuk jemi ne
                
    if(!prs.merrDerguesinEMesazhit(msg).equals(nick)){
                    
    //shtojme emrin tek lista
                    
    parent.shtoAnetare(prs.merrDerguesinEMesazhit(msg));
                    
    //lajmerojme qe dikush hyri
                    
    parent.shkruaj("*** "+prs.merrDerguesinEMesazhit(msg)+" hyri ne dhomen "+prs.merrMesazhinEDerguesit(msg)+" !!!");
                }
            }

            
    //nese komanda eshte QUIT
            
    else if(prs.merrKomandenEMesazhit(msg).equals("QUIT")){
                
    //heqim ate qe doli nga lista
                
    parent.hiqAnetare(prs.merrDerguesinEMesazhit(msg));
                
    //lajmerojme qe dikush doli nga dhoma
                
    parent.shkruaj("*** "+prs.merrDerguesinEMesazhit(msg)+" QUIT :doli nga chati."+prs.merrMesazhinEDerguesit(msg)+" !!!");
            }

            
    //nese komanda eshte NICK
            
    else if(prs.merrKomandenEMesazhit(msg).equals("NICK")){
                
    //nderrojme emrin e listes me emrin e ri
                
    parent.zevendesoEmrin(prs.merrDerguesinEMesazhit(msg),prs.merrMesazhinEDerguesit(msg));
                
    //lajmerojme qe dikush nderroi emrin
                
    parent.shkruaj("*** "+prs.merrDerguesinEMesazhit(msg)+" njihet tani me pseudonimin  "+prs.merrMesazhinEDerguesit(msg)+" !!!");
            }

            
    //nese komanda eshte NOTICE
            
    else if(prs.merrKomandenEMesazhit(msg).equals("NOTICE")){

                
    //thjesht vizualizojme mesazhin
                
    parent.shkruaj(">>"+prs.merrDerguesinEMesazhit(msg)+">>"+prs.merrMesazhinEDerguesit(msg));
            }

            
    //nese komanda eshte MODE
            
    else if(prs.merrKomandenEMesazhit(msg).equals("MODE")){

                
    //copetojme mesazhin dhe nxjerrim informacionin e duhur
                
    String derguesi,dhoma="",mode="",banmask="";
                
    StringTokenizer cop;
                
    derguesi=prs.merrDerguesinEMesazhit(msg);
                
    cop=new StringTokenizer(msg);
                if(
    cop.hasMoreTokens()) cop.nextToken();
                if(
    cop.hasMoreTokens()) cop.nextToken();
                if(
    cop.hasMoreTokens()) dhoma=cop.nextToken();
                if(
    cop.hasMoreTokens()) mode=cop.nextToken();
                if(
    cop.hasMoreTokens()) banmask=cop.nextToken();
                
    //lajmerojme se kush dhe ne cfare MODE kaloi
                
    parent.shkruaj("*** "+derguesi+" kaloi ne MODE "+mode+" "+dhoma+" "+banmask);
            }

            
    //nese komanda eshte  KICK
            
    else if(prs.merrKomandenEMesazhit(msg).equals("KICK")){
                
    //nxjerrim nga mesazhi informacionin e duhur
                
    String derguesi,dhoma="",ikesi="",arsyeja;
                
    StringTokenizer cop;
                
    derguesi=prs.merrDerguesinEMesazhit(msg);
                
    cop=new StringTokenizer(msg);
                if(
    cop.hasMoreTokens()) cop.nextToken();
                if(
    cop.hasMoreTokens()) cop.nextToken();
                if(
    cop.hasMoreTokens()) dhoma=cop.nextToken();
                if(
    cop.hasMoreTokens()) ikesi=cop.nextToken();
                
    arsyeja=prs.merrMesazhinEDerguesit(msg);
                
    parent.hiqAnetare(ikesi);// e heqim nga lista
                //lajmerojme se kush u perzua nga dhoma
                
    parent.shkruaj("*** "+ikesi+" u perzu nga dhoma "+dhoma+" nga "+derguesi+" "+arsyeja);
            }
        }

        
    /*
        * Merret me mesazhet e serverit
        */
        
    private void merruMeMesazheServeri(String msg){
            
    //kontrollon nese kemi bere JOIN apo jo
            //kjo sherben atehere kur disa servera nuk pranojne direkt regjistrimin me komanden JOIN
            //por duan ne fillim tju pergjigjesh komandes PING
            //ne kete rast ne bejme JOIN sepse nje komande numerike nga serveri tregon se regjistrimi
            // u krye me sukses dhe mund te futemi ne nje dhome
            
    if(!joinPOJO) {
                
    joinPOJO=true;
                
    join(dhoma);
            }

            
    //nese komanda ka numrin 353 do te thote
            //qe mesazhi permban listen e anetareve
            
    if(prs.merrKomandenEMesazhit(msg).equals("353")){
                
    //nxjerrim listen dhe e copetojme
                
    StringTokenizer cop=new StringTokenizer(prs.merrMesazhinEDerguesit(msg));
                
    //per cdo token
                
    while(cop.hasMoreTokens()){
                    
    //shtojme nje anetar ne liste
                    
    parent.shtoAnetare(cop.nextToken());
                }
            }

            
    //nese komanda ka numrin 372 do te thote se eshte mesazhi i dites
            //dhe thjesht vizualizojme mesazhin
            
    else if(prs.merrKomandenEMesazhit(msg).equals("372")){
                
    parent.shkruaj(prs.merrMesazhinEDerguesit(msg));
            }

            
    //nese eshte ndonje numer tjeter kam pertuar te shtoj kontrolle te tjera
            //thjesht e vizualizoj
            //do ti shtoj me vone
            
    else {
                
    parent.shkruaj(prs.merrMesazhinEDerguesit(msg));
            }
        }

        
    /*
        * Kjo metode merret me komandat e serverit
        * dhe meqenese e vetmja komande qe serveri dergon eshte PING
        * merremi vetem me te
        */
        
    private void merruMeKomanden(String msg){
            
    //kontrollojme nese komanda eshte PING
            //nese eshte "PING :blablabla"
            //duhet ti pergjigjemi me "PONG :blablabla"
            //pra te njetin mesazh por me komande PONG
            //per kete mjafton te ndryshojme vetem I e ta kthejme ne O
            
    if(prs.merrKomanden(msg).equals("PING")){
                
    String msg2="";
                
    boolean ipari=true;
                
    //per cdo shkronje te mesazhit
                
    for(int i=0;i<msg.length();i++){
                    
    //nese shkronja eshte I dhe eshte i e pare
                    
    if(msg.charAt(i)=='I' && ipari) {
                        
    msg2+='O';// ne vend te I shruajme O
                        
    ipari=false;
                    }
                    
    //perndryshe kopjojme shkronjen ashtu sic eshte
                    
    else msg2+=msg.charAt(i);

                }
                
    //ne fund ja kthejme mesazhin
                
    komunikuesi.dergo(msg2);
            }
        }

        
    /*
        * metode qe i shton nje pseudonim listes se bllokimit
        */
        
    public void blloko(String nicku){
            if(!
    listaBllokimit.contains(nicku)){
                
    listaBllokimit.add(nicku);
            }
        }

        
    /*
        * metode me te cilen kontrollojme nese nje pseudonim ndodhet apo jo ne liste
        */
        
    public boolean eshteBllokuar(String nicku){
            return 
    listaBllokimit.contains(nicku);
        }

        
    /*
        * metode me te cilen heqim nje pseudonim nga lista e bllokimit
        */
        
    public void zhblloko(String nicku){
            
    listaBllokimit.remove(nicku);
        }


  5. #5
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    DritarePrivate.java

    Kodi PHP:
    /*
    * DritarePrivate.java
    *
    * @author  xfiles
    *
    * Kjo klase krijon nje dritare private ne rast se dikush kerkon mesazh privat
    * ose vete perdoruesi kerkon te flase ne privat me dike.
    *
    */

     
    import java.awt.event.*;    //per ActionListener dhe ActionEvent
     
    import javax.swing.*;        //per grafiken swing
     
    import java.awt.*;            //ngjyrat etj

    public class DritarePrivate extends JFrame implements ActionListener{

        
    //deklarimi i komponenteve private grafike
        
    private JButton bllokoButton;
        private 
    JButton dergoButton;
        private 
    JTextArea fushaTextArea;
        private 
    JTextField fushaTextField;
        private 
    JPanel jPanel1;
        private 
    JPanel jPanel2;
        private 
    JScrollPane jScrollPane1;

        private final 
    String emri;            //emri i bashkebiseduesit
        
    private final String une;                //pseudonimi jone
        
    private final Administruesi admin;    //Administruesi

        
    private String biseda="";        //Nje String ku regjistrohet e gjithe biseda
                                        //do na duhet per te llogaritur pozicionin e kursorit
                                        //dhe mbase per te shtuar funksione te tjera
                                        //si psh te regjistrojme biseden ne nje dosje ne rast se
                                        //duam ta shpetojme

        /*
        * Konstruktori qe merr si parametra Administruesin,emrin e bashkebiseduesit dhe nickun tone
        */
        
    public DritarePrivate(Administruesi admin,String emri,String une) {
            
    this.admin=admin;
            
    this.emri=emri;
            
    this.une=une;
            
    ndertoNderfaqen(); //therret metoden qe pozicionon dhe rregullon nderfaqen grafike
            
    this.setTitle("Bisede Private me "+emri); //vendos titullin e dritares
            
    this.setVisible(true);    //therritet ne vend te show() e cila eshte deprecated
        
    }

        
    /*
        * kjo metode nderton nderfaqen grafike dhe shton Listener te gjithe butonave dhe komponenteve
        * perkates.
        */
        
    private void ndertoNderfaqen() {

            
    //inicializon komponentet
            
    jPanel2 = new JPanel();
            
    bllokoButton = new JButton();
            
    jPanel1 = new JPanel();
            
    fushaTextField = new JTextField();
            
    dergoButton = new JButton();
            
    jScrollPane1 = new JScrollPane();
            
    fushaTextArea = new JTextArea();

            
    //vendosim qe ne mbyllje te dritares dritarja te zhduket. Sikur te vendosnim EXIT_ON_CLOSE
            //ne mbyllje te nje dritareje private do te thirrej exit() qe do te mbyllte te gjithe aplikacionin
            
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

            
    //vendosim layout managerin e jPanel2
            
    jPanel2.setLayout(new BorderLayout());

            
    //vendosim tekstin e bllokoButton
            
    bllokoButton.setText("Blloko");
            
    //i shtojme degjues ngjarjesh
            
    bllokoButton.addActionListener(this);
            
    //vendosim butonin ne lindje te panelit
            
    jPanel2.add(bllokoButtonBorderLayout.EAST);

            
    jPanel1.setLayout(new BorderLayout());// e njejta gje

            
    fushaTextField.setBackground(new Color(255255204));//vendosim ngjyren e background
            
    fushaTextField.setForeground(new Color(00153));//vendosim ngjyren e shkronjave te fushes

            //shtojme Action listener fushes qe cdo here qe te shtypim butonin enter
            //te dergojme tekstin ne fushe pa shtypur butonin dergo
            
    fushaTextField.addActionListener(this);

            
    //kur hapet dritarja bejme qe fokusi te kaloje tek fusha ne kete menyre
            //fillojme te shkruajme pa pasur nevoje per zgjedhje me maus
            
    fushaTextField.requestFocus();

            
    //vendosim fushen ne qender te panelit
            
    jPanel1.add(fushaTextFieldBorderLayout.CENTER);

            
    //te njejtat gjera me butonin e dergimit
            
    dergoButton.setText("Dergo");
            
    dergoButton.addActionListener(this);
            
    jPanel1.add(dergoButtonBorderLayout.EAST);

            
    //fusim jPanel1 brenda ne jPanel2. Mejithese kjo duket e panevojshme
            //behet qe nese vendosim ti shtojme nje toolbar psh dritares ta shtojme direkt tek
            //jPanel2 pa ndikuar ne layoutin e jPanel1
            
    jPanel2.add(jPanel1BorderLayout.CENTER);

            
    //meqe eshte swing ja shtojme panelit kryesor
            
    getContentPane().add(jPanel2BorderLayout.SOUTH);

            
    //rregullojme edhe fushen e madhe
            
    fushaTextArea.setBackground(new Color(204255204));
            
    fushaTextArea.setColumns(40);
            
    fushaTextArea.setEditable(false);
            
    fushaTextArea.setRows(12);
            
    fushaTextArea.setLineWrap(true);
            
    fushaTextArea.setWrapStyleWord(true);
            
    jScrollPane1.setViewportView(fushaTextArea); //e shtojme ne nje Scroll Pane

            
    getContentPane().add(jScrollPane1BorderLayout.CENTER); //kuptohet

            
    pack(); //kuptohet
        
    }

        
    /*
        * Kjo eshte metoda qe vizualizon nje mesazh ne fushen e dritares
        * perdoret nga vete dritarja kur dergon mesazhet si dhe eshte publike
        * sepse perdoret nga admin per te vizualizuar mesazhet ardhes
        */
        
    public void shkruajMesazh(String msg,String derguesi){
            
    biseda+="<"+derguesi+"> "+msg+"\n";        //axhornojme biseden
            
    fushaTextArea.append("<"+derguesi+"> "+msg+"\n");    //shtojme mesazhin e formatuar
            
    fushaTextArea.setCaretPosition(biseda.length());//llogarisim pozicionin e kursorit
                                                            //ne kete menyre fusha ben scroll
                                                            //automatikisht ne fund.
        
    }

        
    /*
        * metoda qe dergon mezazhet
        */
        
    private void dergo(String msg) {
            
    shkruajMesazh(msg,une); //vizualizojme ate qe po dergojme
            
    admin.dergoMesazhPrivat(emri,msg); //dergojme mesazhin privat
                                                //eshte administruesi qe merret me formatimin e mesazhit
            
    fushaTextField.setText("");        //boshatisim fushen e dergimit keshtu qe eshte gati
                                            //per mesazhin tjeter

        
    }

        
    /*
        * implementojme metoden e Nderfaqes ActionListener.
        * dhe vendosim kodin per tu zbatuar sa here qe ndodh nje aksion
        */
        
    public void actionPerformed(ActionEvent e){
            
    Object o=e.getSource();

            
    //nese burimi eshte fusha ose butoni dergimit
            
    if(o==dergoButton || o==fushaTextField){
                
    dergo(fushaTextField.getText()); //dergon mesazhin
            
    }
            else if(
    o==bllokoButton){
                
    admin.blloko(emri);
            }
        }


  6. #6
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRC.java

    Kodi PHP:
    /*
    * KlientiIRC.java
    *
    * @author xfiles
    *
    * Kjo klase krijon nje nderfaqe e cila perfaqeson nje Nderfaqe(interface) grafike te cfaredoshme qe
    * ofron keto metoda. Kjo eshte shkruar per te krijuar pavaresine e klasave te cilat punojne me
    * protokollin dhe rrjetin nga siperfaqja grafike.
    * Ne kete menyre mund te krijoj ,ndryshoj modifikoj nje nderfaqe grafike per chatin pa u ngaterruar
    * me te tjerat.
    */

    public interface KlientiIRC {

        
    //merr emrin e perdoruesit nga nderfaqja grafike. Eshte e kuptueshme qe inputi kalon nepermjet
        //komponenteve grafike
        
    public String merrUser();

        
    //merr emrin e dhomes
        
    public String merrDhomen();

        
    //merr emrin e serverit
        
    public String merrServerin();

        
    //merr pseudonimin
        
    public String merrNick();

        
    //merr numrin e portes
        
    public int merrPorten();

        
    //metoda qe vizualizon nje mesazh te cfaredoshem
        
    public void shkruaj(String str);

        
    //metoda qe shton nje antare tek lista grafike kur merret nje mesazh nga serveri
        //se dikush hyri ne dhome
        
    public void shtoAnetare(String antar);

        
    //metoda qe heq nje anetare nga dhoma nese serveri lajmeron se
        // dikush la dhomen
        
    public String hiqAnetare(String antar);

        
    //nese dikush nderron nick atehere dhe lista grafike duhet ta pasqyroje
        
    public void zevendesoEmrin(String vjeter,String ri);




  7. #7
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRCPanel.java(pjesa 1)

    Kodi PHP:
    /*
    * KlientiIRCPanel.java
    *
    * @author xfiles
    *
    * Kjo klase eshte nderfaqja grafike e programit IRC dhe implementon nderfaqen KlientiIRC
    * Vendosa qe te bente 'extend' JPanel per te rritur modularitetin dhe pavaresine e ketij
    * programi nga ambienti ne te cilin perdoret. Sikur te ishte nje JFrame do duhej goxha pune
    * per ta kthyer ne nje applet dhe sikur te na duheshin te dyja ,applet dhe aplikacioni
    * ne fazen e zhvillimit por edhe te modifikimit do duhej qe edhe appletit edhe JFrame
    * do ti benim te njejtat ndryshime dhe do rishkruanim kot te njejtin kod.
    * Ne kete menyre ky panel mund te perdoret brenda nje applet ose frame pa
    * pasur nevoje te ndryshoje madje mund ti shtohet edhe nje aplikacioni tjeter java
    * si panel qe eshte.
    * Mund te vihet re se kjo klase njeh vetem Administratorin dhe nuk varet nga klasat e tjera.
    */

     /*bejme import te gjitha ca na duhen per kete klase*/
     
    import java.awt.*;
     
    import java.awt.event.*;
     
    import javax.swing.*;
     
    import javax.swing.border.*;

    public class 
    KlientiIRCPanel extends JPanel implements KlientiIRC,ActionListener {

        
    //deklarimi i komponenteve grafike
        
    private JPanel dergoPanel1;
        private 
    JButton privatButton;
        private 
    JTextField nickInitTextField;
        private 
    JPanel chatPanel;
        private 
    JButton dergoButton;
        private 
    JPanel dergoPanel;
        private 
    JTextField dhomaInitTextField;
        private 
    JButton dhomaNdrroButton;
        private 
    JTextField dhomaTextField;
        private 
    JScrollPane fushaScrollPane;
        private 
    JTextArea fushaTextArea;
        private 
    JButton lidhuButton;
        private 
    JLabel jLabel1;
        private 
    JLabel jLabel2;
        private 
    JLabel jLabel3;
        private 
    JLabel jLabel4;
        private 
    JLabel jLabel5;
        private 
    JLabel jLabel6;
        private 
    JPanel jPanel1;
        private 
    JPanel jPanel2;
        private 
    JSplitPane jSplitPane1;
        private 
    JButton DircButton;
        private 
    JToolBar jToolBar1;
        private 
    JToolBar jToolBar2;
        private 
    JToolBar jToolBar3;
        private 
    JButton konfiguroButton;
        private 
    java.awt.List listaList;
        private 
    JScrollPane listaScrollPane2;
        private 
    JPanel menuPanel;
        private 
    JTextField mesazhTextField;
        private 
    JButton nickNdrroButton;
        private 
    JTextField nickTextField;
        private 
    JTextField perdoruesiTextField;
        private 
    JTextField portaTextField;
        private 
    JTextField serverTextField;
        private 
    JButton kthehuButton;

        private 
    String biseda="";        //memorizojme te gjithe biseden e dhomes
        
    private Administruesi admin;    //deklarojme Administruesin

        /*
        * Administruesin e inicializon vete kjo klase sepse
        * duke qene ky nje aplikacion i bazuar ne grafike
        * objekti parent i te gjitheve do te jete kjo klase
        * me vecorine qe nuk njeh asnje klase tjeter pervec administruesit
        */
        
    public KlientiIRCPanel(){
            
    setLayout(new CardLayout());    //vendosim CardLayout qe te duket ose hyrja ose chati
            
    ndertoNderfaqen();                //ndertojme grafiken
            
    setPreferredSize(new Dimension(750,460));    //deklarojme dimensionin e preferuar
        
    }

        private 
    void ndertoNderfaqen(){    //si te dritarja private

            //inicializojme komponentet grafike
            
    jPanel1 = new JPanel();
            
    jPanel2 = new JPanel();
            
    jLabel3 = new JLabel();
            
    serverTextField = new JTextField();
            
    jLabel4 = new JLabel();
            
    dhomaInitTextField = new JTextField();
            
    jLabel5 = new JLabel();
            
    portaTextField = new JTextField();
            
    jLabel6 = new JLabel();
            
    perdoruesiTextField = new JTextField();
            
    lidhuButton = new JButton();
            
    chatPanel = new JPanel();
            
    menuPanel = new JPanel();
            
    jToolBar1 = new JToolBar();
               
    DircButton= new JButton();
            
    jToolBar2 = new JToolBar();
            
    jLabel1 = new JLabel();
            
    dhomaTextField = new JTextField();
            
    dhomaNdrroButton = new JButton();
            
    jToolBar3 = new JToolBar();
            
    jLabel2 = new JLabel();
            
    nickTextField = new JTextField();
            
    nickNdrroButton = new JButton();
            
    konfiguroButton = new JButton();
            
    jSplitPane1 = new JSplitPane();
            
    fushaScrollPane = new JScrollPane();
            
    fushaTextArea = new JTextArea();
            
    listaScrollPane2 = new JScrollPane();
            
    listaList = new java.awt.List();
            
    dergoPanel = new JPanel();
            
    mesazhTextField = new JTextField();
            
    dergoButton = new JButton();
            
    nickInitTextField=new JTextField();
            
    JLabel nickLabel=new JLabel("Pseudonimi:  ");
            
    kthehuButton=new JButton("Kthehu");
            
    dergoPanel1=new JPanel();
            
    privatButton=new JButton("Bisede Private");

            
    setBackground(new Color(200,200,255)); //vendosim ngjyren e panelit(e parendesishme)

            /*krijojme dhe rregullojme panelin e hyrjes ne fillim panelin jPanel1*/

            //krijojme nje FlowLayout
            
    FlowLayout fl=new FlowLayout(FlowLayout.CENTER5150);

            
    //vendosim vertical gap ne 0
            
    fl.setVgap(0);

            
    //vendosi kete layout tek jPaneli1
            
    jPanel1.setLayout(fl);
            
    jPanel1.setBackground(new Color(205,205,205));

            
    //rregullojme panelin qe do mbaje fushat e vlerave si nick,porta etj etj
            
    jPanel2.setLayout(new GridLayout(6205));
            
    jPanel2.setBackground(new Color(205,205,205));

            
    //rregulojme tabelen e pseudonimit
            
    nickLabel.setFont(new Font("Microsoft Sans Serif"112));
            
    nickLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(nickLabel);//shtojme tabelen panelit

            //rregullojme fushen e tekstit te pseudonimit
            
    nickInitTextField.setBackground(new Color(204,255,204));
            
    nickInitTextField.setForeground(new Color(204,0,51));
            
    jPanel2.add(nickInitTextField);//shtojme fushen panelit

            //rregullojme tabelen e serverit
            
    jLabel3.setFont(new Font("Microsoft Sans Serif"112));
            
    jLabel3.setText("Serveri:  ");
            
    jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(jLabel3);

            
    //rregullojme fushen e serverit
            
    serverTextField.setBackground(new Color(204255204));
            
    serverTextField.setColumns(15);
            
    serverTextField.setForeground(new Color(204051));
            
    jPanel2.add(serverTextField);

            
    //rregullojme tabelen e dhomes
            
    jLabel4.setFont(new Font("Microsoft Sans Serif"112));
            
    jLabel4.setText("Dhoma:  ");
            
    jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(jLabel4);

            
    //rregullojme fushen e dhomes
            
    dhomaInitTextField.setBackground(new Color(204255204));
            
    dhomaInitTextField.setColumns(15);
            
    dhomaInitTextField.setForeground(new Color(20400));
            
    jPanel2.add(dhomaInitTextField);

            
    //rregullojme tabelen e portes
            
    jLabel5.setFont(new Font("Microsoft Sans Serif"112));
            
    jLabel5.setText("Porta:  ");
            
    jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(jLabel5);

            
    //rregullojme fushen e portes
            
    portaTextField.setBackground(new Color(204255204));
            
    portaTextField.setColumns(15);
            
    portaTextField.setForeground(new Color(20400));
            
    jPanel2.add(portaTextField);

            
    //rregullojme tabelen e perdoruesit
            
    jLabel6.setFont(new Font("Microsoft Sans Serif"112));
            
    jLabel6.setText("Perdoruesi:  ");
            
    jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(jLabel6);

            
    //rregullojme fushen e perdoruesit
            
    perdoruesiTextField.setBackground(new Color(204255204));
            
    perdoruesiTextField.setForeground(new Color(20400));
            
    jPanel2.add(perdoruesiTextField);

            
    //rregullojme butonin e lidhjes
            
    lidhuButton.setText("Lidhu");
            
    lidhuButton.addActionListener(this);

            
    //rregullojme butonin e kthimit i cili do na duhet
            //per tu kthyer mbrapsht nga konfigurimi
            
    jPanel2.add(lidhuButton);
            
    kthehuButton.addActionListener(this);

            
    //shtojme panelin e fushave tek paneli i hyrjes
            
    jPanel1.add(jPanel2);

            
    //panelin e hyrjes e shtojme tek ky panel me emrin card1 per CardLayout
            
    this.add(jPanel1"card1");

            
    /*rregullojme panelin e chatit*/
            //vendosim BorderLayout
            
    chatPanel.setLayout(new BorderLayout());

            
    //rregullojme panelin e menuse
            
    menuPanel.setLayout(new BoxLayout(menuPanelBoxLayout.X_AXIS));
            
    menuPanel.setBackground(new Color(102255255));

            
    //rregullojme jToolbar1 qe do mbaje ikonat ose butonat
            //tani per tani ka vetem nje por mund ti shtohen
            
    jToolBar1.setBorder(new BevelBorder(BevelBorder.RAISED));
            
    jToolBar1.setFloatable(false);
            
    jToolBar1.setRollover(true);
            
    DircButton.setText("DIRC");
            
    jToolBar1.add(DircButton);    //shtojme butonin per informacionin mbi
            //mbi kete aplikacion si dhe autoret etj etj(Divjaka IRC)

            
    menuPanel.add(jToolBar1);//shtojme toolbarin e pare

            //rregullojme toolbarin e dyte
            
    jToolBar2.setBorder(new BevelBorder(BevelBorder.RAISED));
            
    jToolBar2.setFloatable(false);
            
    jToolBar2.setRollover(true);

            
    //rregullojme tabelen e ndrrimit te emrit te dhomes
            
    jLabel1.setFont(new Font("Microsoft Sans Serif"311));
            
    jLabel1.setText("Dhoma:");
            
    jToolBar2.add(jLabel1); //shtojme tabelen

            //rregullojme fushen e ndrrimit te emrit te dhomes
            
    dhomaTextField.setBackground(new Color(204255205));
            
    dhomaTextField.setColumns(10);
            
    dhomaTextField.setForeground(new Color(204051));
            
    dhomaTextField.setToolTipText("shkruani emrin e dhomes qe doni te krijoni ose te shkoni.");
            
    jToolBar2.add(dhomaTextField);//shtojme fushen

            //rregullojme dhe shtojme butonin e ndrrimit te dhomes
            
    dhomaNdrroButton.setText("Nderro Dhomen");
            
    dhomaNdrroButton.addActionListener(this);
            
    jToolBar2.add(dhomaNdrroButton);

            
    //shtojme toolbarin e dyte tek paneli menuse
            
    menuPanel.add(jToolBar2);

            
    //rregullojme toolbarin e trete
            
    jToolBar3.setBorder(new BevelBorder(BevelBorder.RAISED));
            
    jToolBar3.setFloatable(false);
            
    jToolBar3.setRollover(true);

            
    //rregullojme dhe shtojme tabelen e nderrimit te nickut
            
    jLabel2.setFont(new Font("Microsoft Sans Serif"311));
            
    jLabel2.setText("Nick:");
            
    jToolBar3.add(jLabel2);

            
    //rregullojme dhe shtojme fushen e nderrimit te nickut
            
    nickTextField.setBackground(new Color(204255204));
            
    nickTextField.setColumns(10);
            
    nickTextField.setForeground(new Color(204051));
            
    nickTextField.setToolTipText("Shkruani Pseudonimin tuaj te ri.");
            
    jToolBar3.add(nickTextField);

            
    //rregullojme dhe shtojme butonin e nderrimit te nickut
            
    nickNdrroButton.setText("Nderro Pseudonim");
            
    nickNdrroButton.addActionListener(this);
            
    jToolBar3.add(nickNdrroButton);

            
    //rregullojme dhe shtojme butonin e konfigurimit
            
    konfiguroButton.setText("Konfiguro");
            
    konfiguroButton.setToolTipText("Kthehu tek fillimi per te nderruar serverin");
            
    konfiguroButton.addActionListener(this);
            
    jToolBar3.add(konfiguroButton);

            
    menuPanel.add(jToolBar3);//shojme toolbarin e trete

            //vendosim menuPanel me BorderLayout ne veri
            
    chatPanel.add(menuPanelBorderLayout.NORTH);

            
    //rregullojme jSplitPane1 ne te cilin do vendosim listen e emrave dhe fushen
            //ne kete menyre perdoruesi do mund ta ridimensionoje fushen dhe listen
            
    jSplitPane1.setDividerSize(3);
            
    jSplitPane1.setResizeWeight(0.70);
            
    jSplitPane1.setAutoscrolls(true);
            
    jSplitPane1.setContinuousLayout(true);
            
    jSplitPane1.setLastDividerLocation(-1);
            
    jSplitPane1.setMinimumSize(new Dimension(00));
            
    jSplitPane1.setPreferredSize(new Dimension(00));
            
    jSplitPane1.setRequestFocusEnabled(false);

            
    //rregullojme dhe shtojme fushen e madhe ne te majte
            
    fushaTextArea.setBackground(new Color(204,255,204));
            
    fushaTextArea.setLineWrap(true);
            
    fushaTextArea.setWrapStyleWord(true);
            
    fushaTextArea.setEditable(false);
            
    fushaScrollPane.setViewportView(fushaTextArea);
            
    jSplitPane1.setLeftComponent(fushaScrollPane);

            
    //rregullojme dhe shtojme listen grafike ne te djathte
            
    listaList.setBackground(new Color(204,204,255));
            
    listaList.setMultipleMode(false);
            
    listaScrollPane2.setMinimumSize(new Dimension(1500));
            
    listaScrollPane2.setPreferredSize(new Dimension(1500));
            
    listaScrollPane2.setViewportView(listaList);
            
    jSplitPane1.setRightComponent(listaScrollPane2);

            
    //shtojme jSlitPane ne qender te chatPanel
            
    chatPanel.add(jSplitPane1BorderLayout.CENTER);

            
    //vendosim BorderLayout per dergoPanel
            
    dergoPanel.setLayout(new BorderLayout());

            
    //rregullojme dhe shtojme ne qender fushen e dergimit te tekstit
            
    mesazhTextField.setBackground(new Color(204,255,204));
            
    mesazhTextField.setForeground(new Color(20400));
            
    mesazhTextField.addActionListener(this);
            
    dergoPanel.add(mesazhTextFieldBorderLayout.CENTER);

            
    //rregullojme dhe shtojme ne lindje butonin e dergimit
            
    dergoButton.setText("Dergo");
            
    dergoButton.addActionListener(this);
            
    dergoPanel.add(dergoButtonBorderLayout.EAST);

            
    //veme Border Layout tek dergoPanel1
            
    dergoPanel1.setLayout(new BorderLayout());

            
    //rregullojme dhe shtojme butonin e dritares private ne lindje
            
    privatButton.addActionListener(this);
            
    dergoPanel1.add(privatButtonBorderLayout.EAST);

            
    //shtojme dergoPanel brenda dergoPanel1 ne qender
            
    dergoPanel1.add(dergoPanelBorderLayout.CENTER);

            
    //shtojme dergoPanel1 ne jug te chatPanel
            
    chatPanel.add(dergoPanel1BorderLayout.SOUTH);

            
    //shtojme chatPanel si card2 per CardLayout
            //keshtu vetem njeri do te jete i vizualizuar
            
    this.add(chatPanel"card2");

        }

        
    /**
        *shiko nderfaqen KlientiIRC
        */
        
    public String merrUser(){
            
    String user=this.perdoruesiTextField.getText();

            
    //nese fusha eshte bosh vizualizon nje mesazh gabimi
            
    if(user.equals("")) shkruaj("**Gabim! Ju lutem plotesoni fushen e perdoruesit**");
            return 
    user;
        } 
    vazhdon ...

  8. #8
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRCPanel.java(pjesa 2)

    Kodi PHP:
        /**
        *shiko nderfaqen KlientiIRC
        */
        
    public String merrDhomen(){
            
    String  dhoma=this.dhomaInitTextField.getText();

            
    //kontrollon nese fusha eshte bosh
            
    if(dhoma.equals("")){
                
    shkruaj("**Gabim! Ju lutem plotesoni fushen e dhomes**");
            }
            
    //nese dhoma nuk eshte shkruajtur mire e korigjon
            //psh: nese shkruhet 'shqiperia' kjo e kthen ne '#shqiperia'
            
    else if(dhoma.charAt(0)!='#') {
                
    dhoma='#'+dhoma;
            }
            return 
    dhoma;
        }

        
    /**
        *shiko nderfaqen KlientiIRC
        */
        
    public String merrServerin(){
            
    String serveri=this.serverTextField.getText();

            
    //kontrollon nese fusha eshte bosh
            
    if(serveri.equals("")) shkruaj("**Gabim! Ju lutem plotesoni fushen e serverit**");
            return 
    serveri;
        }

        
    /**
        *shiko nderfaqen KlientiIRC
        */
        
    public String merrNick(){
            
    String nick=nickInitTextField.getText();

            
    //kontrollon nese fusha eshte bosh
            
    if(nick.equals("")) shkruaj("**Gabim! Ju lutem plotesoni fushen e pseudonimit**");
            return 
    nick;
        }

        
    /**
        *shiko nderfaqen KlientiIRC
        */
        
    public int merrPorten(){
            
    String porta portaTextField.getText();
            
    int iporta;

            
    //kontrollon nese fusha eshte bosh
            
    if(porta.equals("")) {
                
    shkruaj("**Gabim! Ju lutem plotesoni fushen e portes**");
                return 
    0;
            }
            else try{
                
    iporta=Integer.parseInt(porta);
            }catch(
    NumberFormatException ex){

                
    //nese nuk eshte nje numer vizualizon gabimin
                
    shkruaj("**Gabim! Shkruani nje vlere te pranueshme ne fushen e portes**");
                return 
    0;
            }
            if(
    iporta>65535) {
                
    shkruaj("**Gabim! Shkruani nje numer porte me te vogel se 65535**");
                return 
    0;
            }
            return 
    iporta;
        }

        
    /**
        *vizualizon nje mesazh te cfaredoshem
        */
        
    public void shkruaj(String str){
            
    biseda+=str+"\n";    //shton line feed per te kaluar ne rreshtin tjeter tek biseda
            //te cilen e duam kopjen e asaj qe shohim te vizualizuar

            
    fushaTextArea.append(str+"\n"); //shton tekstin tek fusha
            
    fushaTextArea.setCaretPosition(biseda.length()); //bejme scroll ne fund
        
    }

        
    /**
        *fshin fushen dhe gjithashtu biseden
        *dhe i rifillon
        */
        
    private void fshijFushen(){
            
    fushaTextArea.setText("");
            
    biseda="";
        }

        
    /*
        * Kontrollon emri ndodhet ne dhome dhe cfare prefiksi ka
        */
        
    private int ndodhetNeListe(String emri){
            
    int rint=-1//fillimisht e marrim -1 dmth qe nuk ekziston

            //per cdo emer te listes kontrollon prfiksin dhe e krahason me emrin
            
    for(int i=0;i<listaList.getItemCount();i++){
                
    String a2=listaList.getItem(i);

                if(
    a2.charAt(0)=='@'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=1;
                    }
                }
                else if(
    a2.charAt(0)=='+'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=2;
                    }
                }
                else if(
    a2.charAt(0)=='&'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=3;
                    }
                }
                else if(
    a2.charAt(0)=='%'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=4;
                    }
                }
                else if(
    a2.charAt(0)=='~'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=5;
                    }
                }
                else {
                    if(
    a2.equals(emri)){
                        
    rint=0;
                    }
                }
            }
            return 
    rint;
        }

        
    /*
        * metoda qe shton nje antare tek lista grafike kur merret nje mesazh nga serveri
        * se dikush hyri ne dhome
        */
        
    public void shtoAnetare(String antar){

            
    //nese emri nuk ndodhet ne liste
            
    if(ndodhetNeListe(antar)==-1){

                
    //nese lista ka emra
                
    if(listaList.getItemCount()>0){

                    
    //krahaso te gjithe emrat dhe vendose ne vendin e duhur sipas alfabetit
                    
    for(int i=0;i<listaList.getItemCount();i++){
                        
    String a2=listaList.getItem(i);
                        if(
    antar.compareToIgnoreCase(a2)<0){
                            
    listaList.add(antar,i);
                            break;
                        }else if(
    antar.compareToIgnoreCase(a2)==0){
                            break;
                        }else if(
    i==(listaList.getItemCount()-1)) {
                            
    listaList.add(antar);
                        }
                    }
                }
                
    //nese nuk ka emra nuk ka nevoje te krahasohet
                
    else listaList.add(antar);
            }
            
    //nese emri eshte ne liste atehere nuk ben asgje
        
    }

        
    /*
        * metoda qe heq nje anetare nga dhoma nese serveri lajmeron se
        * dikush la dhomen
        */
        
    public String hiqAnetare(String antar){
            
    String prefiks=""//deklarojme prefiksin nese emri eshte operator etj
            
    int kodi=ndodhetNeListe(antar);
            
    //nese funksioni kthen 0 do te thote se emri nuk ka pefiks keshtu qe e
            //heqim direkt
            
    if(kodi==0){
                
    listaList.remove(antar);
            }

            
    //nese funksioni kthen 1 do te thote se emri ka '@' si prefiks(operator)
            
    else if(kodi==1){
                
    listaList.remove("@"+antar); //heqim emrin duke i shtuar nje '@' perpara
                
    prefiks="@";
            }

            
    //nese funksioni kthen 2 do te thote se emri ka '+' si prefiks (voice)
            
    else if(kodi==2){
                
    listaList.remove("+"+antar);// e njejta gje
                
    prefiks="+";
            }

            
    //nese funksioni kthen 3 do te thote se emri ka '&' si prefiks(super operator)
            
    else if(kodi==3){
                
    listaList.remove("&"+antar);
                
    prefiks="&";
            }

            
    //nese funksioni kthen 4 do te thote se emri ka '%' si prefiks(half operator)
            
    else if(kodi==4){
                
    listaList.remove("%"+antar);
                
    prefiks="%";
            }

            
    //nese funksioni kthen 5 do te thote se emri ka '~' si prefiks(nuk e di domethenien)
            
    else if(kodi==5){
                
    listaList.remove("~"+antar);
                
    prefiks="~";
            }

            
    //kthen prefiksin
            
    return prefiks;
        }

        
    /*
        * nese dikush nderron nick atehere dhe lista grafike duhet ta pasqyroje
        */
        
    public void zevendesoEmrin(String vjeter,String ri){
            
    String prefiks=hiqAnetare(vjeter);
            
    shtoAnetare(prefiks+ri); //nderrohet emri por jo prefiksi
        
    }

        
    /*
        * therret metoden e Administruesit hapMesazhPrivat
        * merr si parameter emrin me te cilin kerkon te bisedosh
        */
        
    private void hapBisedePrivate(String dest){
            
    admin.hapMesazhPrivat(dest);
        }

        
    /*
        * Kjo eshte metoda qe duhet te implementojme nga nderfaqja ActionListener
        */
        
    public void actionPerformed(ActionEvent e){
            
    Object o=e.getSource();

            
    //nese shtypet butoni i lidhjes
            
    if(o== lidhuButton){
                
    CardLayout lo=(CardLayout)(getLayout()); //perftojme layout manaxherin e ketij paneli
                //dhe i bejme cast per CardLayout

                //nese kemi qene lidhur me pare me nje server tjeter
                //shkeputemi ne fillim nga serveri
                
    if(admin!=null){
                    
    admin.quit("Mirupafshim!");
                    
    admin.mbaro();
                }

                
    listaList.removeAll();    //fshijme listen ne rast se rilidhemi
                
    lo.last(this);            //kalojme ne vizualizimin e chatPanel duke ndrruar rendin
                
    fshijFushen();            //fshijme fushen
                
    jPanel2.add(kthehuButton);    //shtojme butonin 'kthehu'
                
    admin=new Administruesi(this);//krijojme nje administrues te ri
                
    if(admin.eshteOk()) admin.fillo();
                else 
    admin=null;
            }

            
    //nese shtypet butoni konfigurimit
            
    else if(o==konfiguroButton){
                
    CardLayout lo=(CardLayout)(getLayout()); //perftojme layout manager
                
    lo.first(this); //kalojme ne vizualizimin e panelit te hyrjes duke ndrruar rendin
            
    }

            
    //nese shtypet butoni dergimit ose tasti enter ne fushen e dergimit
            
    else if(o==dergoButton || o==mesazhTextField){
                
    admin.dergoDhomes(mesazhTextField.getText());    //dergojme mesazh dhomes
                
    mesazhTextField.setText("");        //fshijme fushen qe te jete gati per mesazhin tjeter
            
    }

            
    //nese shtypet butoni kthimit thjesht vizualizojme perseri chatPanel
            
    else if(o==kthehuButton){
                
    CardLayout lo=(CardLayout)(getLayout());
                
    lo.last(this);
            }

            
    //nese shtypet butoni per mesazhet private
            
    else if(o==privatButton){
                
    hapBisedePrivate(listaList.getSelectedItem());    //therret metoden hap bisede private
                //duke i kaluar si parameter emrin e listes qe eshte zgjedhur
            
    }

            
    //nese shtypet butoni i ndrrimit te pseudonimit
            
    else if(o==nickNdrroButton){
                
    admin.nderroNick(nickTextField.getText());    //therret metoden e Administruesit
                //i cili merret me kete pune duke marre si parameter tekstin e fushes se pseudonimit
            
    }

            
    //nese shtypet butoni i ndrrimit te dhomes
            
    else if(o==dhomaNdrroButton){
                
    fshijFushen();    //meqe do ndrrojme dhomen fshijme fushen
                
    listaList.removeAll(); //do te kete emra te tjere prandaj fshijme listen
                
    admin.part();    //metoda e Administratorit qe largohet nga dhoma me komanden PART
                
    admin.join(dhomaTextField.getText());    //metoda e Administratorit qe hyn ne nje dhome
            
    }
        }


  9. #9
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRCAplikacion.java

    Kodi PHP:
    /*
    * KlientiIRCAplikacion.java
    *
    * @author xfiles
    *
    *Kjo klase thjesht sherben si guacke per te perdorur KlientiIRCPanel
    *si nje aplikacion
    *
    */

    //importojme paketat e nevojshme
     
    import java.awt.*;
     
    import javax.swing.*;

    public class 
    KlientiIRCAplikacion extends JFrame {
        private final 
    KlientiIRCPanel paneliIrc;
        public 
    KlientiIRCAplikacion(){
            
    this.setBounds(100,100,750,460);
            
    paneliIrc=new KlientiIRCPanel();
            
    setResizable(false); //e bejme te paridimensionueshme
            
    FlowLayout fl=new FlowLayout();
            
    fl.setVgap(1);
            
    fl.setHgap(1);
            
    getContentPane().setLayout(fl);

            
    //nese mbyllet dritarja JVM ndalon
            
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            
    setTitle("Klienti IRC");
            
    setBackground(new Color(200,200,255));
            
    getContentPane().add(paneliIrc);
            
    pack();
            
    setVisible(true);
        }

        public static 
    void main(String args[]){
            
    EventQueue.invokeLater(new Runnable() {
                public 
    void run() {
                    new 
    KlientiIRCAplikacion();
                }
            });
        }



  10. #10
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRCApplet.java

    Kodi PHP:
    /*
    *
    * KlientiIRCApplet.java
    *
    * @author xfiles
    *
    * Kjo klase eshte nje shembull i perdorimit te ketij klienti IRC ne nje Applet
    * E vetmja pengese ne applet eshte leja e perdorimit te socket
    * u mundova te krijoja nje PolicyFile por me kot nuk kuptoj se si
    * mund ta perdor Socket permission
    * punon vetem me localhost sipas policy file standart te appletit ose me nje socket te lidhur me hostin nga
    * u ngarkua appleti dmth qe serveri dhe appleti te jene ne te njejten makine(server)
    * Nuk kam gjetur material te mjaftueshem per ta zgjidhur kete problem
    */

    import java.awt.*;
    import javax.swing.*;

    public class 
    KlientiIRCApplet extends JApplet{
        private 
    KlientiIRCPanel paneliIrc;
        public 
    void init(){
            
    paneliIrc=new KlientiIRCPanel();
            
    setBackground(Color.gray);
            
    setSize(800,600);
            
    getContentPane().add(paneliIrc);
        }

    Kodi HTML per te integruar Applet ne nje faqe web:

    Kodi:
    
    
    Kjo kerkon qe faqja HTML dhe klasat e perpiluara te ndodhen ne te njejten kartele.
    Nese klasat ndodhen diku tjeter mjafton qe ne atributin "code" te vendosni adresen e sakte te vendndodhjes se klases "KlientiIRCApplet"

  11. #11
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691
    Ja dhe kodi i permbledhur ne nje arkiv ZIP.

    Perpilojeni me versionin Java te preferuar qe ju perdorni dhe ekzekutoni "KlientiIRCAplikacion".

    Per ç'do paqartesi apo problem mund te postoni ne kete teme.

    P.S.Vura re se publikimi i kodit tek postimet si kod PHP nuk vizualizon komentet e stilit /* */. Per komentet e detajuara shkarkoni kodin dhe hapeni ne editorin tuaj te preferuar.
    Skedarët e Bashkëngjitur Skedarët e Bashkëngjitur

  12. #12
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691
    Ja dhe nje pakete JAR e ekzekutueshme, e perpiluar me versionin java 1.5.0_01.

    Shkarkoni paketen dhe hiqni mbrapashtesen ".zip" te cilen ia shtova per arsye se nuk ma lejonte forumi me mbrapashtese ".jar".
    Skedarët e Bashkëngjitur Skedarët e Bashkëngjitur

  13. #13
    automotive Maska e ClaY_MorE
    Anëtarësuar
    16-05-2004
    Vendndodhja
    Deutschland
    Postime
    4,456
    Një imazh nga ky projekt?

    Pasi ka anëtarë që kërkojnë java por nuk pëlqejnë të bëjnë gjithë ato veprime për ta parë atë. Siç jam edhe unë
    Jeta ime, mban emrin e saj..

  14. #14
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691
    Ja ku behet login dhe mesazhet e fillimit te serverit irc.albasoul.com
    Fotografitë e Bashkëngjitura Fotografitë e Bashkëngjitura   

  15. #15
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691
    Ja dhe dy momente nga dhoma publike #shqiperia dhe nje bisede private.
    Fotografitë e Bashkëngjitura Fotografitë e Bashkëngjitura   

  16. #16
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691
    Nuk ka shkrime me ngjyra dhe shumicen e mesazheve te serverit e shfaq ashtu si i vjen, dmth shume i thjesht nga kjo ane.

  17. #17
    [L]{I}[N]{U}[X] Maska e Ardi_Pg_ID
    Anëtarësuar
    28-01-2003
    Vendndodhja
    New York City Haven on Earth
    Postime
    2,679
    Xfiles mund te flasim nje dite bashke ne messenger ose dicka te tille me njofto pak me mp pasi duat te flasim pak ne lidhje me kete klient
    Forgiving Islamic Terrorists is Gods Duty, Our Duty Is To arrange the Meeting
    N. H. Schwarzkopf

  18. #18
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691
    Po Ardi_pg_ID, te dergoj kontaktin tim me MP.

  19. #19
    Hallall Xfiles!!!
    Keyboard not found .... press any key to continue!

  20. #20
    Ec te vdeksha divjaka...
    "Expensive watches do not create time, but reflect how expensive it is to their owner."

Faqja 0 prej 2 FillimFillim 12 FunditFundit

Tema të Ngjashme

  1. Kryeministri i Kosoves, klient i rregullt ne nje shtepi publike ne Shkup
    Nga Nice_Boy në forumin Tema e shtypit të ditës
    Përgjigje: 32
    Postimi i Fundit: 19-02-2009, 16:16
  2. Kafeja e mengjesit
    Nga Dito në forumin Tema shoqërore
    Përgjigje: 58
    Postimi i Fundit: 11-07-2006, 15:22
  3. Pacient apo klient!
    Nga Mina në forumin Tema shoqërore
    Përgjigje: 4
    Postimi i Fundit: 11-01-2003, 23:09

Regullat e Postimit

  • Ju nuk mund të hapni tema të reja.
  • Ju nuk mund të postoni në tema.
  • Ju nuk mund të bashkëngjitni skedarë.
  • Ju nuk mund të ndryshoni postimet tuaja.
  •