אוקי אני עושה את זה רק בגלל שהפורום מת!
ואני אוהב לתיכנות אז אני ילמד אותכם בכללי איך הפרוטוקול של ה IRC עובד
איך לבנות בוט בסיסי ב Perl.
למה Perl כי בבוט של IRC משתמשים הרבה במחרוזות
והכי נוח לעבוד עם זה ב Perl, בנוסף היא שפה ממש פשוטה
ולא מסובכת ללמידה לאנשים חדשים.


הפרוטוקול של IRC עובד ככה
שאתם מתחברים אל השרת(בד"כ דרך פורט 6667)
השרת לא שולח כלום.
אתם דבר ראשון צריכים להציג את עצמכם ע"י בחירת ניק
אז אתם שולחים לשרת:

קוד:
NICK <WantedNick>
עכשיו אני אומר את זה עכשיו, ואני יחזור על זה תמיד
כל פקודה ששולחים לשרת, כדי שהשרת יתחיל לבדוק אותה
ולראות מה בכלל אנחנו רוצים ממנו אנחנו צריכים לרדת שורה
כלומר ללחוץ אנטר, עכשיו בגלל שבוט זה דבר אוטומטי
ואנחנו לא רוצים לשבת וללחוץ אנטר כל פעם.
יש בשביל זה שני תווים מיוחדים, המוכרים לכל מתכנת

קוד:
\r \n
הם מסמנים על לרדת שורה
אני לא יפרט מה כל אחד מהם עושה, תחפשו בגוגל
עכשיו אחרי שלחתם לשרת את הניק
השרת שולח לכם PING (זה מחרוזת לא להבהל)
כדי לבדוק שאתם באמת מחוברים
כל כמה דקות השרת שולח לכם הודעה כזאת
קוד:
PING :dddsdas
PING : ומשהו רנדומלי אחרי, אתם צריכים כל פעם שזה קורה
לשלוח לשרת PONG ואת מה שקיבלתם ב PING
כלומר אם הוא שלח

קוד:
PING :dddsdas
אתם צריכים להחזיר

קוד:
PONG :dddsdas
זה לא קשה
אין צורך בריבוי תהליכים או בשום דבר אחר
(שמתי לב שחלק מהשרתים כמו Irccoil לא מבקשים
PING איך שמתחברים אליהם אבל כמו כל שרת IRC
הם כן מבקשים PING כל כמה דקות)

אוקי נמשיך
אחרי ששלחתם PONG השרת לא מחזיר כלום אם זה נכון
עכשיו אתם צריך לשלוח את הפקודה USER

הפקודה הולכת ככה
קוד:
user <username> <hostname> <servername> <realname>
אני לא יסביר עכשיו איך למלאות אותה אני יראה את זה עם הבוט שלי

אם כתבתם את הפקודה נכון הוא יחבר אותכם לשרת
ואז כדי להשאר מחוברים אתם פשוט צריכים להחזיר PONG
כל פעם שהוא שולח PING

עכשיו לבוט עצמו:

נתחיל בזה שאנחנו רוצים להתחבר אל השרת קודם
נקח את Irc.co.il
שרת ישראלי מוכר וטוב

נתחיל בזה שאנחנו צריכים להתחבר לשרת
אז אנחנו צריכים סוקטים מן הסתם.
נקרא דבר ראשון למודל הזה.
קוד:
use IO::Socket::INET;
עכשיו אנחנו רוצים להתחבר לשרת irc.co.il דרך פורט 6667

קוד:
my $sock = new IO::Socket::INET(PeerAddr => 'irc.co.il',
                PeerPort => '6667',
                Proto => 'tcp');
die "Cant Connect" unless $sock;
עכשיו נתחיל בשיחה עם השרת אז דבר ראשון
שאנחנו צריכים לעשות זה לבחור ניק (כמו שאמרתי קודם)

קוד:
print $sock "NICK Alphanoob\r\n";
יש \r\n כמו שאמרתי כדי שהשרת יבין שאנחנו שולחים לו פקודה.
(אני ממשיך האלה בתקווה שאף אחד אחר לא משתמש בניק הזה)

עכשיו צריך לבדוק אם קיבלנו PING

קוד:
$answer = <$sock>;
if($answer=~ /PING (.*?)\r\n/)
{
     print $sock "PONG $1\r\n";
}
מה שהחלק הזה עושה
הוא בודק אם השרת שלח משהו, ואז הוא בודק
אם יש PING אז הוא שולח PONG עם אותו מחרוזת שהבאה אחרי ה PING

אחרי שהוא שלח PONG (אם הוא קיבל)

אנחנו צריכים לשלוח USER
קוד:
print $sock "User Bot 0 0 :Bot\r\n";

$answer = <$sock>;
שוב לפקודה הזאת אין הרבה חשיבות זה Ident ו RealName
לא משהו חשוב, אל תשכחו בסוף הפקודה \r\n

עכשיו אנחנו מחוברים עכשיו צריך לדאוג שכל פעם שאנחנו
מקבלים PING אנחנו נחזיר PONG
אז יש דרך מאד קלה לעשות את זה

קוד:
while($answer = <$sock>)
{
 
    if($answer=~ /PING (.*?)\r\n/)
    {
        print $sock "PONG $1\r\n";
}
}
זה כבר בוט פעיל שיכול להיות מחובר 24/7
אבל לרוע המזל הבוט הזה לא יודע לעשות כלום
חוץ מלהשאיר את עצמו מחובר, אז איך מוסיפים עוד פקודות
כמו JOIN PART MSG
יש כמה דרכים לעשות את זה
הסבר קצר איך מקבלים הודעה ב IRC
כשמישהו שולח הודעה אליכם לפרטי או לערוץ שאתם נמצאים בו, אתם בעצם מקבלים הודעה כזאת מהשרת

קוד:
:logan!~logan@Alpha.Noob PRIVMSG #alphanoob :!raw NICK LogBot
איך זה מורכב?
אוקי אז ככה
קוד:
:<NICK>!<Ident>@<Host> PRIVMSG <CHAN/NICK> :<MSG>
(ד"א אני לא רושם את זה אבל ברור שיש \r\n בסוף)

אז איך זה יכול לעזור לנו?
אנחנו רוצים שברגע שנרשום !JOIN #Alphanoob
הבוט יצטרף לערוץ שלנו
אבל אנחנו רוצים שהוא יצטרף רק אם אנחנו נשלח לו
את ההודעה איך עושים את זה?
די פשוט

אנחנו נצטרך להוסיף את השורה הזאת אחרי השורה
של בדיקת ה PING
קוד:
    elsif($answer =~ /\:(.*?)\!(.*?)\@(.*?) PRIVMSG (.*?) \:\!JOIN (.*?)\r\n/)
     {
         if($1 eq "logan")
         {
             print $sock "JOIN :$5\r\n";
         }
    }
(למי שלא מבין PERL בודקת כל שורה שהיא מקבלת
אם יש משהו בסיגנון הזה ואז אם יש היא מפרקת אותו

אני לא יסביר פה על איך להוסיף עוד פקודות כי
זה פחות או יותר אותו הדבר אם אתם מסתבכים ואתם
רוצים לבנות בוט ב C++, C# או כל שפה אחרת
אני מוכן לנסות לעזור לכם

והנה הקוד המלא של הבוט לא בדקתי אם זה עובד

קוד:
use IO::Socket::INET;

my $sock = new IO::Socket::INET(PeerAddr => 'irc.co.il',
                PeerPort => '6667',
                Proto => 'tcp');
die "Cant Connect" unless $sock;

print $sock "NICK Alphanoob\r\n";
$answer = <$sock>;
if($answer=~ /PING (.*?)\r\n/)
{
     print $sock "PONG $1\r\n";
}
print $sock "User Bot 0 0 :Bot\r\n";

$answer = <$sock>;

print $sock "JOIN :#Atraf-f\r\n";

#:logan!~logan@Alpha.Noob PRIVMSG LogiBot :!raw NICK LogBot
while($answer = <$sock>)
{
    if($answer=~ /PING (.*?)\r\n/)
    {
        print $sock "PONG $1\r\n";
    }

    elsif($answer =~ /\:(.*?)\!(.*?)\@(.*?) PRIVMSG (.*?) \:\!quit\r\n/)
     {
         if($1 eq "logan")
         {
             print $sock "QUIT :Harakiri\r\n";
         }
    }
    elsif($answer =~ /\:(.*?)\!(.*?)\@(.*?) PRIVMSG (.*?) \:\!JOIN (.*?)\r\n/)
     {
         if($1 eq "logan")
         {
             print $sock "JOIN :$5\r\n";
         }
    }
}
הבוט נבנה בשפה PERL
אם אתם רוצים להריץ את זה על ווינדוס או לינוקס
תורידו Active Perl
תשמרו את הקובץ כ bot.pl
ותריצו את הפקודה perl bot.pl