1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. teh_hahn

Beiträge von teh_hahn

  • Nach 10 Mausklick eine Taste drücken

    • teh_hahn
    • 13. September 2007 um 13:33

    Hi,

    genau so siehts aus. Gegen einen Moorhuhnbot hab ich persönlich jetzt aber auch nichts auszusetzen. Einfach kurz zu Anfang erläutern, wozu das Ganze ist. Dann gibts auch keine Probleme!
    Also, ich erklär Dir mal meinen Code:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $ai_coord = -1
    While 1 ;~ Die Endlosschleife, da Du es ja die ganze Zeit ausführen möchtest.
    For $i = 1 To 10 ;~ Zählt von 1 bis 10, ...
    $ai_coord = PixelSearch(444, 263, 990, 441, 0xC76567) ;~ ... besorgt sich die X- und Y-Koordinaten und ...
    If IsArray($ai_coord) Then MouseClick("left", $ai_coord[0], $ai_coord[1], 1, 0) ;~ ... führt einen Mausklick auf die Koordinaten aus (IsArray ist nur für den Falle eines Fehlers).
    #region - Wartet bis die linke Maustaste gedrückt wurde (Vielleicht weglassen und nur durch Sleep(20) ersetzen...).
    Do
    Sleep(20)
    Until _IsPressed("01")
    #endregion
    Next
    Send("{SPACE}") ;~ Drückt einmal auf die Leertaste.
    WEnd

    [/autoit]
  • Laufwerksbuchstabe

    • teh_hahn
    • 13. September 2007 um 10:59

    Hi,

    Spoiler anzeigen
    [autoit]

    Local Const $S_SEARCHFILE = "MyScript.cmd"
    Local Const $S_INIFILE = @ScriptDir & "\" & "NetPaths.ini"
    Local Const $AS_LETTERS[26] = ["z:", "y:", "x:", "w:", "v:", "u:", "t:", _
    "s:", "r:", "q:", "p:", "o:", "n:", "m:", "l:", "k:", "j:", "i:", _
    "h:", "g:", "f:", "e:", "d:", "c:", "b:", "a:"]
    For $i = 0 To 25
    If DriveGetType($AS_LETTERS[$i]) = "Network" Then
    If FileExists($AS_LETTERS[$i] & "\" & $S_SEARCHFILE) Then IniWrite($S_INIFILE, "Paths", "NetDrive", $AS_LETTERS[$i])
    EndIf
    Next

    [/autoit]
  • Fileopen Fileread FileXists Problem

    • teh_hahn
    • 13. September 2007 um 10:53

    Mhh,

    Deinen Fehler kann ich mit meinem Skript hier nicht nachvollziehen!
    Versuch vielleicht mal

    [autoit]

    $s_line = FileReadLine($h_file)

    [/autoit]


    durch

    [autoit]

    $s_line = StringStripCR(FileReadLine($h_file))

    [/autoit]


    zu ersetzen, bzw. logge $s_line mal in eine Datei, ob da irgendwelche Sonderzeichen mit drin sind...

  • Auf Tastendruck warten

    • teh_hahn
    • 13. September 2007 um 09:25

    Hi,

    ja, das ist ja klar. HotKeySet setzt den Hotkey ja nur.
    Musst Du so tun:

    [autoit]

    HotKeySet("{F11}", "GUIShow")
    While 1
    Sleep(50)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func GUIShow()
    MsgBox(64, "Debug", "Deine Funktion!")
    EndFunc

    [/autoit]
  • Fileopen Fileread FileXists Problem

    • teh_hahn
    • 13. September 2007 um 08:26

    Hi,

    daran liegts nicht, da Not das Gleiche bewirkt.
    Bei mir funktioniert folgender Code:

    Spoiler anzeigen
    [autoit]

    Local Const $S_FILE = @ScriptDir & "\Installort.txt"
    Local $h_file = -1
    Local $s_line = ""

    [/autoit] [autoit][/autoit] [autoit]

    $h_file = FileOpen($S_FILE, 0)
    If $h_file = -1 Then
    MsgBox(16, "ERROR", "Unable to open file", 5)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $s_line = FileReadLine($h_file)
    If @error Then ExitLoop
    If Not FileExists($s_line) Then
    MsgBox(16, "ERROR", $s_line & " ist nicht installiert!")
    Else
    Run($s_line)
    EndIf
    WEnd
    FileClose($h_file)

    [/autoit]


    Vorraussetzung ist natürlich, dass in der TXT-Datei der vollständige Pfad zu den Programmen steht!

  • GUI Probleme - Progress Bar-Optik, Exit mit esc, parrallele Abläufe

    • teh_hahn
    • 13. September 2007 um 08:12

    Hi,

    @Daniel W.: Was meinst Du genau mit dem Standard-Windowsstyle? Meinst Du $GUI_SS_DEFAULT_GUI, der ist aber nicht Vorraussetzung für eine smoothe Progressbar.

    @AutoME39: Zu Deinen Fragen:
    1. Zeig mal Deinen Source-Code, bzw. schau Dir meinen untenstehenden an.
    2. Die Option GUICloseOnESC muss auf 1 gesetzt sein und in der GUI-Schleife muss auf $GUI_EVENT_CLOSE abgefragt werden, dann brauchst Du keine eigene Exit-Funktion mittels Hotkey definieren.
    3. Es sind maximal zwei "Pseudo-Threats" möglich. Siehe Hilfe unter AdlibEnable.

    In diesem Beispiel ist noch einmal alles vorhanden:

    Spoiler anzeigen
    [autoit]

    Opt("MustDeclareVars", 1)
    Opt("GUICloseOnESC", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $i_adlib = 0
    Local $h_gui = -1, $h_progress = -1, $h_runbt = -1
    $h_gui = GUICreate("Progressbar GUI", 320, 240, -1, -1, $WS_POPUPWINDOW)
    $h_progress = GUICtrlCreateProgress(10, 10, 300, 20, $PBS_SMOOTH)
    $h_runbt = GUICtrlCreateButton("&Run", 10, 40, 50, 20)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    AdlibEnable("ParallelFunc", 5000)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    GUIDelete()
    AdlibDisable()
    Exit
    Case $h_runbt
    For $i = 1 To 100
    GUICtrlSetData($h_progress, $i)
    Sleep(20)
    Next
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func ParallelFunc()
    $i_adlib += 1
    TrayTip("I am a second 'threat'!", "Executed " & $i_adlib & " times...", 1)
    EndFunc

    [/autoit]
  • Nach 10 Mausklick eine Taste drücken

    • teh_hahn
    • 12. September 2007 um 15:42

    Kann durchaus sein, dass der simulierte Mausklick nicht erkannt wird. Das hier erfüllt Deine ursprüngliche Fragestellung:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $ai_coord = -1
    For $i = 1 To 10
    $ai_coord = PixelSearch(444, 263, 990, 441, 0xC76567)
    If IsArray($ai_coord) Then MouseClick("left", $ai_coord[0], $ai_coord[1], 1, 0)
    Do
    Sleep(50)
    Until _IsPressed("01")
    MsgBox(0, "Debug", "Clicked " & $i & " times...", 3)
    Next
    Send("{SPACE}")

    [/autoit]

    @Mods: 3 Threads eröffnet, dreimal Verdacht bzw. klare Absicht eines Bots...

  • Autoit Script mit Batch beenden

    • teh_hahn
    • 12. September 2007 um 14:05

    Ja, nimm PHP dafür. Wirst aber wohl um DynDNS nicht rumkommen, oder was meinst Du wie Du sonst das Skript abfragen kannst?! Ausserdem schrieb ich:

    Zitat

    [...]der aber quasi nicht mal am Netz hängt?


    Ohne IP und dementsprechen geforwardeten Port / oder halt PHP ohne SaveMode auf Systemebene, wirst Du da nichts machen können.

    oder halt Remote-Software, aber das willst Du ja auch nicht. (btw. da muss dann auch ein Port geforwardet sein und die IP bekannt sein!)

  • Autoit Script mit Batch beenden

    • teh_hahn
    • 12. September 2007 um 13:43

    rofl. Du willst Deinem Rechner was schicken, der aber quasi nicht mal am Netz hängt? Wie soll das denn gehen?
    Mach Dir im Router ein Portforwarding und schreib Dir Deinen Remote-Client selbst (mit AutoIt). Und versuch auf das Batchskript zu verzichten oder gleich alles in einem Batchskript zu machen (was schwer sein dürfte...).
    Stichwörter: TCPListen, TCPSend, Run

  • Autoit Script mit Batch beenden

    • teh_hahn
    • 12. September 2007 um 13:19

    lol.

    Ehhm. Ok, versteh nicht ganz denn Sinn und Zweck:
    1. Du startest ein Batchskript in Deinem AutoItSkript.
    - Wieso machst Du nicht alles in AutoIt und an gewünschter Stelle Exit?
    - Wieso muss das AutoIt-Skript noch laufen, wenn es "nur" das Batchskript anhaut?
    2. Über wget geht da schon mal gar nix.
    - Möglichkeiten sind PSExec, Aufruf innerhalb eines PERL, PHP oder sonstwas Skriptes.

    Zeig mal Code und sag genau was Dein Skript macht. Deine gewünschte Lösung kommt mir total unsauber vor.

  • Benutzerinformationen auslesen

    • teh_hahn
    • 12. September 2007 um 12:48

    Stilgar. hast Recht. Man greift ja direkt auf die Spalten zu. Wir haben den Wald vor lauter Bäumen nicht gesehen.
    Backslashes müssen in SQL doch escaped werden, also:

    [autoit]

    Local $strUser = "MyHostname\\Administrator"

    [/autoit]


    dann klappts auch mit dem =.

    Ist natürlich trotzdem langsam!

  • Benutzerinformationen auslesen

    • teh_hahn
    • 12. September 2007 um 12:01

    Hi,

    ich habs auch mal eben probiert. Ich würde sagen es liegt daran, dass die Spalte der Tabelle nicht Caption heißt. Weiß allerdings auch nicht, wie man das herausfinden kann: Hier nochmal das Skript mit geschlossenen Anführungszeichen:

    Spoiler anzeigen
    [autoit]

    Global Const $WBEM_FLAG_RETURN_IMMEDIATELY = 0x10
    Global Const $WBEM_FLAG_FORWARD_ONLY = 0x20

    [/autoit] [autoit][/autoit] [autoit]

    Local $strComputer = "localhost"
    Local $strUser = "MyHostname\Administrator"
    Local $s_output = "Computer: " & $strComputer & @CRLF & "==========================================" & @CRLF
    Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    ;~ $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", "WQL", $WBEM_FLAG_RETURN_IMMEDIATELY + $WBEM_FLAG_FORWARD_ONLY)
    Local $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_UserAccount WHERE Caption='" & $strUser & "'", _
    "WQL", $WBEM_FLAG_RETURN_IMMEDIATELY + $WBEM_FLAG_FORWARD_ONLY)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) Then
    For $objItem In $colItems
    $s_output &= "AccountType: " & $objItem.AccountType & @CRLF
    $s_output &= "Caption: " & $objItem.Caption & @CRLF
    $s_output &= "Description: " & $objItem.Description & @CRLF
    $s_output &= "Disabled: " & $objItem.Disabled & @CRLF
    $s_output &= "Domain: " & $objItem.Domain & @CRLF
    $s_output &= "FullName: " & $objItem.FullName & @CRLF
    $s_output &= "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
    $s_output &= "LocalAccount: " & $objItem.LocalAccount & @CRLF
    $s_output &= "Lockout: " & $objItem.Lockout & @CRLF
    $s_output &= "Name: " & $objItem.Name & @CRLF
    $s_output &= "PasswordChangeable: " & $objItem.PasswordChangeable & @CRLF
    $s_output &= "PasswordExpires: " & $objItem.PasswordExpires & @CRLF
    $s_output &= "PasswordRequired: " & $objItem.PasswordRequired & @CRLF
    $s_output &= "SID: " & $objItem.SID & @CRLF
    $s_output &= "SIDType: " & $objItem.SIDType & @CRLF
    $s_output &= "Status: " & $objItem.Status & @CRLF
    If MsgBox(1, "WMI Output", $s_output) = 2 Then ExitLoop
    $s_output = ""
    Next
    Else
    MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "Win32_UserAccount")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & StringMid($dtmDate, 7, 2) & "/" & _
    StringLeft($dtmDate, 4) & " " & StringMid($dtmDate, 9, 2) & ":" & _
    StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
    EndFunc ;==>WMIDateStringToDate

    [/autoit]
  • Hilfe bei #GuiList

    • teh_hahn
    • 12. September 2007 um 09:35

    Hi,

    [0] gibt den Index des Array-Elementes an. Die Funktion

    [autoit]

    _GUICtrlListGetSelItemsText()

    [/autoit]

    hat als Rückgabewert nämlich ein Array und nicht, so wie Du es bisher vielleicht nur kennst eine Variable.
    Dabei steht im Index-0 (also im ersten Element des Arrays) die Anzahl der restlichen Elemente. Xenobiologist überprüft daher zunächst mit

    [autoit]

    If Not IsArray() Then

    [/autoit]

    ob die Funktion nicht korrekt ausgeführt wurde und gibt im Falle einer korrekten Ausführung jede Selektion aus. Dies erreicht er dadurch, dass er von Array-Element 1 (was das erste Element ist, wo eine Selektion drin stehen kann) bis Array-Element n (wie gesagt, das 0te Element [0]) zählt und dann das jeweilige Element in einer MsgBox ausgibt.

  • Problem bei Bot Script

    • teh_hahn
    • 12. September 2007 um 08:09
    Zitat

    probier paint mal im vollbildmodus wenns dort nicht geht weist du das es defentiv am vollbildmodus liegt..


    Das ist doch Blödsinn. Das Spiel sieht eher so aus, als würde es auf eine Grafik API aufbauen. Würde mehr Sinn ergeben, dass PixelSearch nicht darauf zugreifen kann und somit nur unter reinen Windows-Applikationen läuft (Vollbild beim Paint ist kein Vollbild wie in einem Spiel, ist doch nur eine Maximierung der Ansicht!)

    Andersrum: Versuch doch mal das Spiel in einem Fenster auszuführen und begrenze den Bereich, der durchsucht werden soll, indem Du das Fenster in der oberen linken Ecke platzierst, so dass die Karte oben Rechts immer an der gleichen Stelle ist.

    PS: Das Gleiche wie immer: Bots stinken.

  • Tastatur für Bildschirm

    • teh_hahn
    • 11. September 2007 um 11:42

    Hi,

    sicherlich ganz witzig, sehe da aber jetzt auch nicht so denn Sinn drin. ich rall' nicht mal wie ich das Ding verwenden soll. Was ist denn z.B. wenn ich einfach nur das Startmenü öffnen möchte? (Einfach WIN!) Muss ich erst CopyToClip machen?

  • Startmenü sortieren

    • teh_hahn
    • 11. September 2007 um 11:26

    Hi, hat noch einen Schönheitsfehler die Lösung. Falls Windows so eingestellt ist, dass es den Windows Explorer automatisch neustartet, falls er abschmiert wird er zweimal gestartet. Zudem ist nicht gewährleistet, dass der richtige explorer.exe-Prozess abgeschossen wird, da man einstellen kann, dass jeder einen eigenen "Speicherbereich" bekommt. Hier mal die von mir gefixete Variante in Form einer UDF.
    _StartMenuSort:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Function Name.....: _StartMenuSort
    ; Description.......: Checks if a file or directory exists and delete it.
    ; Version...........: 1.0
    ; Change Date.......: 2007-09-11
    ; AutoIt Version....: 3.2.8.1
    ;
    ; Parameter(s)......: $I_TIMEOUT - Integer specifying the time to wait for the
    ; restart of the "explorer.exe"-process in
    ; milliseconds (default = 3000).
    ; Requirements(s)...: "%WINDIR%\explorer.exe"
    ; Return Value(s)...: Returns 1
    ;
    ; Author(s).........: big_daddy <http://www.autoitscript.com/forum/>
    ; Modified by: teh_hahn <[email='sPiTsHiT@gmx.de'][/email]>
    ; Company...........: None
    ; URL...............: http://www.autoit.de/
    ; Note(s)...........: None
    ;===============================================================================
    Func _StartMenuSort(Const $I_TIMEOUT = 3000)
    RegDelete("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu")
    While ProcessExists("explorer.exe")
    ProcessClose("explorer.exe")
    WEnd

    Local Const $N_TIMER = TimerInit()
    While 1
    If ProcessExists("explorer.exe") Then Return (1)
    If TimerDiff($N_TIMER) > $I_TIMEOUT Then
    Run("explorer.exe")
    Return (1)
    EndIf
    Sleep(20)
    WEnd
    EndFunc ;==>_StartMenuSort

    [/autoit]
  • verschiedene Probleme mit gui und Dosbox

    • teh_hahn
    • 11. September 2007 um 09:11

    Hi, ok. Hab Dir mal was mit FTP.exe gemacht (kann mit Deiner Applikation wie geasgt nix anfangen. Beim Starten der Verbindung hab ich das Gleiche Problem wie Du, weiß im moment auch nicht, wie man da an der Standardoutput kommt. Befehle schicken geht aber! (Nur den auskommentierten Teil müsstest Du abändern!)
    FTP.exe GUI v0.1:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    main()

    [/autoit] [autoit][/autoit] [autoit]

    Func main()
    Local $h_gui = -1, $h_hostinp = -1, $h_openbt = -1, $h_cmdinp = -1, $h_sendcmdbt = -1, $h_outputedit = -1
    Local $i_pid = 0
    Local $s_host = "", $s_stdout = "", $s_cmd = ""

    $h_gui = GUICreate("FTP.exe GUI", 320, 240)
    $h_hostinp = GUICtrlCreateInput("ftp.cs.tu-berlin.de", 10, 10, 100, 20)
    $h_openbt = GUICtrlCreateButton("&Open", 10, 40, 60, 20)
    $h_cmdinp = GUICtrlCreateInput("", 10, 80, 100, 20)
    GUICtrlSetState(-1, $GUI_HIDE)
    $h_sendcmdbt = GUICtrlCreateButton("&Send", 10, 120, 60, 20)
    GUICtrlSetState(-1, $GUI_HIDE)
    $h_outputedit = GUICtrlCreateEdit("", 120, 10, 190, 220, $WS_HSCROLL + $WS_HSCROLL + $ES_MULTILINE + $ES_READONLY)
    GUICtrlSetState(-1, $GUI_HIDE)
    GUISetState(@SW_SHOW, $h_gui)
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    GUIDelete($h_gui)
    Exit
    Case $h_openbt
    $s_host = GUICtrlRead($h_hostinp)
    If $s_host Then
    $i_pid = Run(@ComSpec & " /c ftp.exe -A " & $s_host, @SystemDir, @SW_HIDE, 7)
    If Not @error Then
    GUICtrlSetState($h_hostinp, $GUI_DISABLE)
    GUICtrlSetState($h_openbt, $GUI_DISABLE)
    GUICtrlSetState($h_cmdinp, $GUI_SHOW)
    GUICtrlSetState($h_sendcmdbt, $GUI_SHOW)
    GUICtrlSetState($h_outputedit, $GUI_SHOW)
    ;~ While 1
    ;~ $s_stdout &= StdoutRead($I_PID)
    ;~ If @error Then ExitLoop
    ;~ WEnd
    ;~ GUICtrlSetData($h_outputedit, $s_stdout)
    EndIf
    EndIf
    Case $h_sendcmdbt
    $s_cmd = GUICtrlRead($h_cmdinp)
    If $s_cmd Then
    GUICtrlSetState($h_cmdinp, $GUI_DISABLE)
    GUICtrlSetState($h_sendcmdbt, $GUI_DISABLE)
    StdinWrite($i_pid, $s_cmd)
    StdinWrite($i_pid)
    While 1
    $s_stdout &= StdoutRead($i_pid)
    If @error Then ExitLoop
    WEnd
    GUICtrlSetData($h_outputedit, $s_stdout)
    GUICtrlSetState($h_cmdinp, $GUI_ENABLE)
    GUICtrlSetState($h_sendcmdbt, $GUI_ENABLE)
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>main

    [/autoit]
  • Startmenü sortieren

    • teh_hahn
    • 10. September 2007 um 15:07

    Angeblich soll:

    [autoit]

    RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs", "Order")

    [/autoit]


    funktionieren, tut bei mir aber nicht. Vielleicht musst Du auch alle Order-Einträge in den Unterkeys mit löschen!

  • Maus und Tastatur sperren

    • teh_hahn
    • 10. September 2007 um 13:43

    Hi,

    pee's Vorschlag sollte ohne Probleme klappen. Hier mal ein einfaches Beispiel:

    Spoiler anzeigen
    [autoit]

    BlockInput(1)
    While 1
    If ProcessExists("taskmgr.exe") Then
    ProcessClose("taskmgr.exe")
    BlockInput(1)
    EndIf
    Sleep(20)
    WEnd
    BlockInput(0)

    [/autoit]


    Aber VORSICHT! falls es einwandfrei klappt, läufst du damit in eine Endlosschleife und kannst Deinen Rechner nicht mehr bedienen. Also bau besser noch einen Timer ein!

  • Schreibweise/Geschwindigkeit AutoIt3-SourceCode

    • teh_hahn
    • 10. September 2007 um 09:11

    Hi,

    ja die Option

    [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit]

    hab ich mir schon ganz zu Anfang zur Pflicht gemacht. Ist einfach sauberer. Hab eben gesehen, dass am 08.09.2007 AutoIt v3.2.8.0 (Release) raus gekommen ist. Im Changelog findet sich Folgendes:

    Zitat

    - Changed: General speed improvements (currently up to 24% in some cases compared to 3.2.6.0).

    Das halte ich ja für einen ziemlichen hohen Geschwindigkeitsgewinn. Kann schon jemand Aussagen darüber tätigen, welche Bereiche (oder auch Funktionen) von AutoIt das betrifft? Würde auch ziemlich interessant finden, wie er das hinbekommen hat.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™