Entries tagged as im
Related tags
computer android apple bad world blog blogging browser captcha changes cheatsheet code comic contentmanagement css datamining dns documentation eigenfaces encryption feedreader firefox fun google gui hardware howto html http ios iphone jabber java javascript life lighttpd linux linux&unix mail markup media misc mobile murphy networking newsbeuter opensource picture podcast politics presentation privacy programming psi rant realtime regular expression rest rss ruby s9y scala screenshot sdk security server shortys software spam stuff subnetting swing tail -f /var/log/life test tool truecrypt unix video web webdesign websockets webwide windows wordpress xml xslt zeitgeist coffee conference dslr free nikon photography science tv codec perl vp8Da ich gerade an einem Projekt arbeite, dass XMPP auf Java verwendet, hab ich mir zu Testzwecken eine Klasse gebaut, die Smack verwendet und ein paar Moeglichkeiten der API nutzt. Es ist unter anderem moeglich sich zu verbinden, das Roster auszulesen und empfangene Nachrichten anzuzeigen. Da mir bei der offiziellen Dokumentation Beispiele gefehlt haben, die man auf einen Rutsch kopieren und bearbeiten kann, moechte ich hier ein wirklich lauffaehiges Beispiel veroeffentlichen. Ich hoffe, damit kann jemand was anfangen:
import java.util.Collection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
public class SmackTester {
private XMPPConnection conn;
private String username;
private String password;
private String server;
public SmackTester() {
// debug option
XMPPConnection.DEBUG_ENABLED = false;
username = "einuser";
password = "einpasswort!";
server = "jabber.foo.bar";
makeConn();
doConnect();
makeRoster();
chatAction();
// wait ... (I know that's pretty ugly)
while (conn.isConnected()) {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// nothing interesting here
public static void main(String[] args) {
new SmackTester();
}
private void doConnect() {
// let's connect
try {
conn.connect();
conn.login(username, password, "someRessource");
} catch (XMPPException e) {
System.err.println("Login failed!");
e.printStackTrace();
System.exit(1);
}
System.out.println("Login succesful!");
}
private void makeConn() {
ConnectionConfiguration config = new ConnectionConfiguration(server,
5222);
// pass some connection options
config.setSASLAuthenticationEnabled(true);
SASLAuthentication.supportSASLMechanism("PLAIN", 0);
conn = new XMPPConnection(config);
}
private Roster makeRoster() {
Roster roster = conn.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
// print out all entries in roster
System.out.println("---------- entries in roster -----------");
for (RosterEntry entry : entries) {
System.out.println(entry);
}
System.out.println("---------- entries in roster -----------");
// react to changes in roster
roster.addRosterListener(new RosterListener() {
// called methods ...
public void entriesDeleted(Collection<String> addresses) {
// do stuff
}
public void entriesUpdated(Collection<String> addresses) {
// do stuff
}
public void presenceChanged(Presence presence) {
System.out.println("Presence changed: " + presence.getFrom()
+ " " + presence);
}
public void entriesAdded(Collection<String> arg0) {
// do stuff
}
});
return roster;
}
private void chatAction() {
PacketTypeFilter filter = new PacketTypeFilter(Message.class);
PacketListener myListener = new PacketListener() {
public void processPacket(Packet arg0) {
if (arg0 instanceof Message) {
Message msg = (Message) arg0;
System.out.println("Message: " + msg.getFrom() + " "
+ msg.getBody());
}
}
};
// Register the listener.
conn.addPacketListener(myListener, filter);
}
private void doDisconnect() {
conn.disconnect();
System.out.println("Disconnected");
}
}
Schon lange moechte ich das Thinklight meines T60 zur Ankuendigung neuer Nachrichten benutzen. Leider gab es hierfuer bisher nur Plugins fuer Pidgin oder Kopete und die wollte ich beide nicht benutzen. Fuer meinen bevorzugten Jabberclient, PSI, gab es bisher kein solches Plugin. Also war es Zeit fuer mich selbst etwas passendes zu basteln. Herausgekommen ist dabei ein Shellscript und ein dreckiger Hack in den Einstellungen von PSI.
Hier kommt nun zu erst mal das Shellscript, das ich unter /usr/local/bin/thinkblink abgelegt habe. Es laesst das Licht 4 mal kurz aufblinken.
#!/bin/bash
for ((a=1; a <= 4 ; a++))
do
echo "on" > /proc/acpi/ibm/light
sleep 0.4
echo "off" > /proc/acpi/ibm/light
sleep 0.4
done
Damit man das Licht auch als User ansprechen kann, ist es notwendig dem entsprechenden /proc-Device die notwendigen Zugriffsrechte zu verpassen. Hierzu habe ich folgenden Eintrag in meiner /etc/rc.local eingerichtet:
chmod 666 /proc/acpi/ibm/light
Mit diesen beiden Teilen kann man duch die eingabe von /usr/local/bin/thinkblink das Thinklight schon als User blinken lassen. Was nun noch fehlt, ist die Anbindung in PSI. Ich habe hierzu das Audio-System von PSI missbraucht um das Script zu starten. Hier sind mal die Einstellungen:
Calendar
| « | February '12 | » | ||||
| Mo | Tu | We | Th | Fr | Sa | Su |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | ||||



