Ich nutze ja schon eine Weile lang Quassel-IRC. Leider durchsucht die Suche nur das bereits vorhandene Backlog (bzw. die „Chathistorie“) und man muss immer erst mühsam bis zum Anfang hochscrollen, damit er sich „mehr“ holt.
Jetzt hab ich einfach auf dem Server auf dem der Core läuft folgendes PHP-Script hinterlegt:
#!/usr/bin/php -q <?php $shortopts = ""; $shortopts .= "h:"; $shortopts .= "u:"; $shortopts .= "c:"; $shortopts .= "s:"; $options = getopt($shortopts); function getMessage($db, $quasseluser, $channel, $search = null) { $quasseluser = sqlite_escape_string($quasseluser); $channel = sqlite_escape_string($channel); $search = sqlite_escape_string($search); $sql = ' SELECT DISTINCT backlog.time AS time, sender.sender AS sender, backlog.message AS message, buffer.buffername AS buffername FROM backlog OUTER JOIN quasseluser, buffer, sender ON ( quasseluser.username = "'.$quasseluser.'" AND backlog.bufferid = buffer.bufferid AND quasseluser.userid = buffer.userid AND buffer.buffername LIKE "%'.$channel.'%" AND sender.senderid = backlog.senderid )'; if ($search != null) { $sql .= ' WHERE message LIKE "%'.$search.'%";'; } $output = array(); $longestname = 0; foreach ($db->query($sql) as $row) { $sender = explode("!", $row['sender']); $sendername = $sender[0]; if (strlen($sendername) > $longestname) { $longestname = strlen($sendername); } array_push( $output, array( date("Y-m-d H:i:s", $row['time']), $row['buffername'], $sendername, $row['message'] )); } foreach ($output as $entry) { printf("%s (%s) %s : %s\n", $entry[0], $entry[1], str_pad($entry[2], $longestname, " "), $entry[3]); } printf("Es wurden %u Ergebnisse gefunden.\n", count($output)); } try { $homepath = $options["h"]; $username = $options["u"]; $buffer = $options["c"]; $search = $options["s"]; if(!$homepath || !$username || !$buffer) { $output = "usage: "; $output .= __FILE__." -h <path/to/quassel/sqlite> -u <quasseluser> -c <channel/buffer> [-s <string>]"; die($output . "\n"); } $db = new PDO('sqlite:' . $homepath); getMessage($db, $username, $buffer, $search); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); }Keinerlei Fehlerbehandlung, wenns schiefläuft geht bestimmt irgendwas irreperabel kaputt. Keine Garantie für nichts 🙂 Ein möglicher Aufruf wäre:
14:34:46 pennywise ~# ./searchQuassel.php -h quassel-storage.sqlite -u pennywise -c quassel.de -s foobar 2008-11-03 11:49:01 (#quassel.de) pennywise : und da war der Bot jetzt halt drin, weil er irgendwas gesagt hat wie "hallo foobar, wilkkommen in der hölle" 2008-11-06 20:35:57 (#quassel.de) pennywise : kann ich auch ein temporäres netzwerk haben? sowas wie /join irc.server.com/#foobar? 2008-11-12 11:52:56 (#quassel.de) hanswurst : im core-log steht nur "foobar benutzer x getrennt"manpage
-h : Pfad zur SQLite-DB von quasselcore. Liegt meist in ~/.config/quassel-irc.org/
-u : Der Benutzer mit dem man sich in quassel einloggt. Dies hat nichts mit der IRC-Identität zu tun.
-c : Der Channel (bzw. das Query) in dem gesucht werden soll. Ist case insensitive und kann auch nur teilweise übergeben werden (z.B. „quassel“ findet „#quassel“, „#quassel.de“ und „quassel-announce“)
-s : OPTIONAL. Der Text nach dem gesucht werden soll. Wenn weggelassen, dann werden alle Nachrichten im übergebenen Channel zurückgegebenIch hatte auch noch ne Version mit Prepared Statements, aber die hat beim „$db->prepare($sql)“ einfach kein Statement erzeugt. Ohne Fehlermeldung ohne alles. WTF?!