- Offizieller Beitrag
Hi,
ich habe hier mal die Grundform eines IRC-Clienten erstellt. Alle notwendigen Funktionen sind mit enthalten, es braucht also nix includet werden.
In dieser Variante wird bereits nach den wesentlichen Ereignissen im Chat selektiert, alle eingehenden Nachrichten/Ereignisse werden auf die Console ausgegeben. Hier könnte man z.B. mit einer Auswertung ansetzen für einen Bot .
Einige Aktionen, die der Client ausführen kann, habe ich in HotKeys hinterlegt.
Um zu sehen, was der Client tut, geht am besten mit einem IRC-Client (Dana, Miranda o.ä.) in den Chat. Natürlich nicht mit demselben Nick.
Also viel Spaß damit.
Spoiler anzeigen
Global $server = "irc.afterworkchat.com"
Global $channel = '#autoit'
Global $nick = 'TestNick1'
Global $port = 6667
Global $USER, $USER_alt, $text, $txt
HotKeySet('#!w', '_werfen') ; Aktion des Clients
HotKeySet('#!a', '_action') ; Aktion des Clients
HotKeySet('#!s', '_say') ; Client spricht
HotKeySet('#!q', '_quit') ; Abmelden vom Server, Programmende
HotKeySet('#!p', '_part') ; Channel verlassen
HotKeySet('#!j', '_join') ; Channel betreten
TCPStartup ()
Global $sock = _IRCConnect($server, $port, $nick); Verbindung zu IRC und Identifizierung Nickname
While 1
$msg = GUIGetMsg()
If $msg = -3 Then
Exit
EndIf
$recv = TCPRecv($sock, 8192); Empfängt vom Server
If @error Then
Exit MsgBox(1, "IRC Example", "Server has errored or disconnected"); Verbindung zum Server besteht nicht mehr
EndIf
Local $sData = StringSplit($recv, @CRLF); Splittet die Nachrichten, wenn sie vom Server gruppiert werden
For $i = 1 To $sData[0] Step 1; behandelt jede Nachricht einzeln
Local $sTemp = StringSplit($sData[$i], " "); Splittet die Nachricht an den Leerzeichen
If $sTemp[1] = "" Then ContinueLoop; Weiter, wenn leer
If $sTemp[1] = "PING" Then _IRCPing($sock, $sTemp[2]); Prüft ob PING zurückgegeben wird
If $sTemp[0] <= 2 Then ContinueLoop; meist nutzlose Informationen
Switch $sTemp[2]; Splittet die Command Nachricht
Case "266"; Indikator der zeigt, dass alle Infos gesendet wurden
_IRCJoinChannel ($sock, $channel)
_IRCSendMessage($sock, "Hallo!", $channel)
_IRCChangeMode ($sock, "+i", $nick)
Case "332" ; Raumthema
$titel = ''
For $k = 6 To $sTemp[0]
$titel &= $sTemp[$k] & ' '
Next
ConsoleWrite('Thema: ' & $titel & @CRLF)
Case "333" ; Thema von
ConsoleWrite('Thema von: ' & $sTemp[5] & @CRLF)
Case "353" ; Userlist
$text = 'User:' & @CRLF
For $k = 6 To $sTemp[0]
If $k = 6 Then
$text &= @TAB & StringTrimLeft($sTemp[$k],1) & @CRLF
Else
$text &= @TAB & $sTemp[$k] & @CRLF
EndIf
Next
ConsoleWrite($text & @CRLF)
Case 'PRIVMSG' ; Nachricht empfangen
$USER = StringTrimLeft(StringLeft($sTemp[1], StringInStr($sTemp[1], '!')-1), 1)
$text = ''
$txtUSER = ''
For $k = 4 To $sTemp[0]
$text &= $sTemp[$k] & ' '
Next
$text = StringTrimLeft($text, 1)
If StringInStr($text, 'ACTION', 1) Then ; Aktion von USER
$text = StringTrimLeft($text,
$text = StringLeft($text, StringLen($text)-2)
ConsoleWrite('***' & $USER & ' ' & $text & @CRLF)
ElseIf StringInStr($text, 'DCC CHAT', 1) Then ; Direkt-Chatanfrage
$text = 'DCC-Chatanfrage von ' & $USER
ConsoleWrite($text & @CRLF)
Else
ConsoleWrite('<' & $USER & '> ' & $text & @CRLF) ; USER spricht
EndIf
Case 'JOIN' ; Chatraum wird betreten
$USER = StringTrimLeft(StringLeft($sTemp[1], StringInStr($sTemp[1], '!')-1), 1)
ConsoleWrite('***' & $USER & 'betritt den Raum' & @CRLF)
Case 'NICK' ; Nick wird gewechselt
$USER_alt = StringTrimLeft(StringLeft($sTemp[1], StringInStr($sTemp[1], '!')-1), 1)
$USER = StringTrimLeft($sTemp[3], 1)
ConsoleWrite('***' & $USER_alt & ' heißt jetzt: ' & $USER & @CRLF)
Case 'PART' ; Chatraum wird verlassen
$USER = StringTrimLeft(StringLeft($sTemp[1], StringInStr($sTemp[1], '!')-1), 1)
$txt = $USER & ' verläßt den Chatraum '
$text = ''
If $sTemp[0] > 3 Then
For $k = 4 To $sTemp[0]
If $k = 4 Then
$text &= StringTrimLeft($sTemp[$k], 1) & ' '
Else
$text &= $sTemp[$k] & ' '
EndIf
Next
$text = StringTrimRight($text, 1)
EndIf
ConsoleWrite($txt & $text & @CRLF)
Case 'QUIT' ; Server wird verlassen
$USER = StringTrimLeft(StringLeft($sTemp[1], StringInStr($sTemp[1], '!')-1), 1)
$txt = $USER & ' verläßt den Chatraum '
If $sTemp[0] > 3 Then
For $k = 4 To $sTemp[0]
$text &= $sTemp[$k] & ' '
Next
$text = StringTrimRight($text, 1)
$text = $txt & $text
EndIf
ConsoleWrite($txt & $text & @CRLF)
Case Else ; alle Nachrichten, die nicht in andere Kategorien passen, z.B. Server-Infos
ConsoleWrite('sonstiges: ' & $sData[$i] & @CRLF)
EndSwitch
Next
WEnd
#region HotKey-Funktionen
Func _say()
_IRCSendMessage($sock, "Hallo ihr alle!", $channel)
EndFunc
Func _action()
_IRCSendAction ($sock, "begrüßt erst mal alle Chatter persönlich mit Handschlag", $channel)
EndFunc
Func _quit()
_IRCQuit($sock, "Bis zum nächsten Mal")
Exit
EndFunc
Func _werfen()
_IRCSendAction ($sock, "wirft einen bunten Konfettiregen in den Chat", $channel)
EndFunc
Func _part()
_IRCLeaveChannel($sock, 'Bis gleich', $channel)
EndFunc
Func _join()
_IRCJoinChannel ($sock, $channel)
EndFunc
#endregion HotKey-Funktionen
#region IRC-Func
;===============================================================================
;
; Description: Connects you to a IRC Server, and gives your chosen Nick
; Parameter(s): $server - IRC Server you wish to connect to
; $port - Port to connect to (Usually 6667)
; $nick - Nick you choose to use (You can change later)
; Requirement(s): TCPStartup () to be run
; Return Value(s): On Success - Socket identifer
; On Failure - It will exit on error
; Author(s): Chip
; Note(s): English only
;
;===============================================================================
Func _IRCConnect ($server, $port, $nick)
Local $i = TCPConnect(TCPNameToIP($server), $port)
If $i = -1 Then Exit MsgBox(1, "IRC.au3 Error", "Server " & $server & " is not responding.")
TCPSend($i, "NICK " & $nick & @CRLF)
$ping = tcprecv($i,2048)
if stringleft($ping,4) = "PING" Then
$pong = stringreplace($ping,"PING :","")
tcpsend($i,"PONG " & $pong & @LF)
EndIf
TCPSend($i, "USER " & $nick & " 0 0 " & $nick &@CRLF)
Return $i
EndFunc
;===============================================================================
;
; Description: Close the IRC Connection
; Parameter(s): $irc - Socket Identifer from _IRCConnect ()
; $msg - Message to send with quit
; Requirement(s): _IRCConnect () to be run
; Return Value(s): On Success - 1
; On Failure - -1 = Server disconnected.
; Author(s): BugFix
; Note(s): English only
;
;===============================================================================
Func _IRCQuit($irc, $msg="")
If $irc = -1 Then Return 0
TCPSend($irc, "QUIT :" & $msg & @CRLF)
Return 1
EndFunc
;===============================================================================
;
; Description: Leave the IRC Channel
; Parameter(s): $irc - Socket Identifer from _IRCConnect ()
; $msg - Message to send with part
; Requirement(s): _IRCConnect () to be run
; Return Value(s): On Success - 1
; On Failure - -1 = Server disconnected.
; Author(s): BugFix
; Note(s): English only
;
;===============================================================================
Func _IRCLeaveChannel ($irc, $msg="", $chan="")
If $irc = -1 Then Return 0
TCPSend($irc, "PART " & $chan & " :" & $msg & @CRLF)
If @error Then
MsgBox(1, "IRC.au3", "Server has disconnected.")
Return -1
EndIf
Return 1
EndFunc
;===============================================================================
;
; Description: Joins an IRC Channel
; Parameter(s): $irc - Socket Identifer from _IRCConnect ()
; $chan - Channel you wish to join
; Requirement(s): _IRCConnect () to be run
; Return Value(s): On Success - 1
; On Failure - -1 = Server disconnected.
; Author(s): Chip
; Note(s): English only
;
;===============================================================================
Func _IRCJoinChannel ($irc, $chan)
If $irc = -1 Then Return 0
TCPSend($irc, "JOIN " & $chan & @CRLF)
If @error Then
MsgBox(1, "IRC.au3", "Server has disconnected.")
Return -1
EndIf
Return 1
EndFunc
;===============================================================================
;
; Description: Sends a message using IRC
; Parameter(s): $irc - Socket Identifer from _IRCConnect ()
; $msg - Message you want to send
; $chan - Channel/Nick you wish to send to
; Requirement(s): _IRCConnect () to be run
; Return Value(s): On Success - 1
; On Failure - -1 = Server disconnected.
; Author(s): Chip
; Note(s): English only
;
;===============================================================================
Func _IRCSendMessage ($irc, $msg, $chan="")
If $irc = -1 Then Return 0
If $chan = "" Then
TCPSend($irc, $msg & @CRLF)
If @error Then
MsgBox(1, "IRC.au3", "Server has disconnected.")
Return -1
EndIf
Return 1
EndIf
TCPSend($irc, "PRIVMSG " & $chan & " :" & $msg & @CRLF)
If @error Then
MsgBox(1, "IRC.au3", "Server has disconnected.")
Return -1
EndIf
Return 1
EndFunc
;===============================================================================
;
; Description: Sends a message as ACTION using IRC
; Parameter(s): $irc - Socket Identifer from _IRCConnect ()
; $msg - Message you want to send
; $chan - Channel/Nick you wish to send to
; Requirement(s): _IRCConnect () to be run
; Return Value(s): On Success - 1
; On Failure - -1 = Server disconnected.
; Author(s): BugFix
; Note(s): English only
;
;===============================================================================
Func _IRCSendAction ($irc, $msg, $chan="")
If $irc = -1 Then Return 0
If $chan = "" Then
TCPSend($irc, $msg & @CRLF)
If @error Then
MsgBox(1, "IRC.au3", "Server has disconnected.")
Return -1
EndIf
Return 1
EndIf
TCPSend($irc, "PRIVMSG " & $chan & " :" & Chr(1) & "ACTION " & $msg & Chr(1) & @CRLF)
If @error Then
MsgBox(1, "IRC.au3", "Server has disconnected.")
Return -1
EndIf
Return 1
EndFunc
;===============================================================================
;
; Description: Changes a MODE on IRC
; Parameter(s): $irc - Socket Identifer from _IRCConnect ()
; $mode - Mode you wish to change
; $chan - Channel/Nick you wish to send to
; Requirement(s): _IRCConnect () to be run
; Return Value(s): On Success - 1
; On Failure - -1 = Server disconnected.
; Author(s): Chip
; Note(s): English only
;
;===============================================================================
Func _IRCChangeMode ($irc, $mode, $chan="")
If $irc = -1 Then Return 0
If $chan = "" Then
TCPSend($irc, "MODE " & $mode & @CRLF)
If @error Then
MsgBox(1, "IRC.au3", "Server has disconnected.")
Return -1
EndIf
Return 1
EndIf
TCPSend($irc, "MODE " & $chan & " " & $mode & @CRLF)
If @error Then
MsgBox(1, "IRC.au3", "Server has disconnected.")
Return -1
EndIf
Return 1
EndFunc
;===============================================================================
;
; Description: Returns a PING to Server
; Parameter(s): $irc - Socket Identifer from _IRCConnect ()
; $ret - The end of the PING to return
; Requirement(s): _IRCConnect () to be run
; Return Value(s): On Success - 1
; On Failure - -1 = Server disconnected.
; Author(s): Chip
; Note(s): English only
;
;===============================================================================
Func _IRCPing($irc, $ret)
If $irc = -1 Then Return 0
If $ret = "" Then Return -1
TCPSend($irc, "PONG " & $ret & @CRLF)
If @error Then
MsgBox(1, "irc.au3", "Server has disconnected.")
Return -1
EndIf
Return 1
EndFunc
#endregion IRC-Func
#region IRC-Syntax
#cs
Common recieves:
Nick = User who the message is from
Name = Settable by user, set in the USER command
host = ISP host
~~~~PRIVMSG~~~~
You recieve this when someone has sent a message in a channel,
gives you there Nick, host, the channel it was said in and the message.
SYNTAX:
:Nick!Name@host PRIVMSG #Channel :Message
EXAMPLE:
:Chip![email='Chip@OMN-8243F63D.dsl.bell.ca'][/email] PRIVMSG #Chip :Hey guy's
Would be a message from Chip to say 'Hey guy's' in the channel #Chip
:Chip![email='Chip@OMN-8243F63D.dsl.bell.ca'][/email] PRIVMSG Bob :Hey Bob!
Would be a Personal Message from Chip to Bob saying 'Hey Bob!'
~~~~~~~~~
~~~~MODE~~~~
You recieve this when a mode is changed, a mode can give/take access change certain
things like who can join a channel etc..
SYNTAX:
:Nick!Name@host MODE #Channel +/- MODE (USER)
EXAMPLES:
:ChanServ!services@host MODE #Chip +o Chip
This says ChanServ (usually a service bot) has given Chip Operator access in the channel #Chip
:ChanServ!services@host MODE #Chip +i
This makes #Chip invite only, so only OPs can invite users in the channel.
:Chip![email='Chip@OMN-8243F63D.dsl.bell.ca'][/email] MODE Chip +i
This will make Chip invisible to WHOIS. These are usermodes.
~~~~~~~~~
~~~~PING~~~~
You recieves these at random to make sure your still online and
not disconnected.
SYNTAX:
PING :Randomletters
Usually a PING has random letters that you have to respond with.
[/autoit] [autoit][/autoit] [autoit]EXAMPLE:
PING :29809dj0d
You would respond with
PONG 29809dj0d
~~~~~~~~~~~
~~~~JOIN~~~~
You recieve this when someone joins a channel.
SYNTAX:
:Nick!Name@Host JOIN :#Channel
EXAMPLE:
:Chip![email='Chip@OMN-8243F63D.dsl.bell.ca'][/email] JOIN :#Chip
This would be sent to everybody in #Chip to show that Chip has joined the channel #Chip
~~~~~~~~~~~~~
~~~~KICK~~~~
You recieve this when someone gets kicked (Including yourself!)
SYNTAX:
:Nick!Name@Host KICK #Channel User :Reason
EXAMPLE:
:Chip!Name@Host KICK #Chip Bob :Talk in private
Would kick Bob from #Chip and say 'Talk in private' in the reason
~~~~~~~~~~~~~~
~~~~QUIT~~~~
You recieve this when someone disconnects from IRC.
SYNTAX:
:Nick!Name@Host QUIT :Reason
EXAMPLE:
:Chip![email='Chip@OMN-8243F63D.dsl.bell.ca'][/email] QUIT :I'm bored
Would be sent to everyone in the channels Chip was in to say that he left IRC because He was bored.
~~~~~~~~~~~~~~
#ce
#endregion IRC-Syntax