Thursday, November 29, 2007

Official Google talk group chat, PartyChat, and You

As many of you have undoubtedly discovered, Google supports group chat functionality for Google Talk and today added this support to GMail Chat. I've been asked what this means with respect to PartyChat, so I figured I'd write down answers for you, the larger audience.

  • Officiality: Google's group chat offers official group chat behavior for Google talk users. PartyChat is not a product of Google (it's a personal pet project) and has no official support other than what I have time to personally give.

  • Who can use it: The announced group chat only works for Google Talk users (i.e. @gmail accounts or users of Google Apps). PartyChat works with with all Jabber accounts. If you don't know what Jabber is, don't worry. If you do... well, then there you go.

  • Persistence: Google's group chat functionality is designed for one-off conversations. You're talking with X and realize you want to add Y into the conversation. Or maybe you have some specific short-term goal in mind (organizing dinner, say) and have no use for a multi-user chat channel for future use. Once you close the window for a group chat, you've exited that chat forever. PartyChat is designed to be a persistent group chat channel. You stay in the group chat even if you log out. You don't have to re-invite people each time you want to have a discussion.
    For temporary chats, Google talk group chat is the easiest to use. If you have a long term goal in mind, or maybe just want a lasting social forum, then PartyChat will probably satisfy your needs better.

  • Accessibility: Because Google's group chat feature is specific to Google Talk, you must use the Google gadget/client to participate. If you use other chat clients (e.g. iChat, Pidgin, Meebo, a Blackberry, etc.) for Google Talk then you can't enter these group chats. Because PartyChat sits within the network, you use PartyChat from any device that sends/receives messages on the Google Talk/Jabber network.
I'm happy that Google now has wide-spread support for group chat, but I still think there's a need for the special features that PartyChat provides. My friends and I will continue working and supporting PartyChat, so enjoy using both!

Tuesday, November 27, 2007

PartyChat on Facebook


PartyChat now has its own fan page on Facebook. Show your Facebook friends you're a PartyChat fan and help spread the love!

Sunday, October 28, 2007

PartyChat is growing up

PartyChat has thus far used Google Talk accounts for its bots, since that was easiest from a maintenance perspective (no separate Jabber server to run). However, we are now running into rate-limiting issues with GoogleTalk, so the time has come for us to run our own Jabber server. We've now bought the partych.at domain, and have set up these bots:

partychat@partych.at
partychat0@partych.at
partychat1@partych.at
partychat2@partych.at
partychat3@partych.at
partychat4@partych.at
partychat5@partych.at
partychat6@partych.at
partychat7@partych.at
partychat8@partych.at
partychat9@partych.at


You can use any of these bots with our regular instructions. Eventually there will be a migration plan from the @gmail.com bots, hopefully in as transparent as way as possible.

And if you were curious just what usage level we're up that rate limiting is being triggered, here are some stats:

Total party chats: 846
Party chats active in the past week: 247
Average subscribers per chat: 2.39
Most subscribers in a chat: 35

Total subscribers: 2020
Subscribers active in the past week: 741

Sunday, October 07, 2007

Today's issues...

As a lot of you are probably seeing, PartyChat has been very flakey today. I'm still trying to figure out what's happening, so if any of you are smack experts, I could appreciate the help.

The previously running process starts reporting:
[java] Found invalid presence mode
Upon restarting, it outputs:
[java] Trouble connecting to Google Talk
and on a few occasions:
[java] Trouble connecting to Google Talk
[java] java.net.SocketException: Broken pipe
[java] at java.net.SocketOutputStream.socketWrite0(Native Method)
[java] at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
[java] at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
[java] at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
[java] at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:404)
[java] at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:408)
[java] at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
[java] at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
[java] at java.io.BufferedWriter.flush(BufferedWriter.java:236)
[java] at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:274)
[java] at org.jivesoftware.smack.PacketWriter.access$000(PacketWriter.java:40)
[java] at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:87)
[java] java.net.SocketException: Connection reset
[java] at java.net.SocketInputStream.read(SocketInputStream.java:168)
[java] at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
[java] at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
[java] at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
[java] at java.io.InputStreamReader.read(InputStreamReader.java:167)
[java] at java.io.BufferedReader.fill(BufferedReader.java:136)
[java] at java.io.BufferedReader.read1(BufferedReader.java:187)
[java] at java.io.BufferedReader.read(BufferedReader.java:261)
[java] at org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:2971)
[java] at org.xmlpull.mxp1.MXParser.more(MXParser.java:3025)
[java] at org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1144)
[java] at org.xmlpull.mxp1.MXParser.next(MXParser.java:1093)
[java] at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:368)
[java] at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:44)
[java] at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:76)
or
[java] java.net.SocketException: Socket closed
[java] at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
[java] at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
[java] at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
[java] at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:404)
[java] at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:408)
[java] at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
[java] at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
[java] at java.io.BufferedWriter.flush(BufferedWriter.java:236)
[java] at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:274)
[java] at org.jivesoftware.smack.PacketWriter.access$000(PacketWriter.java:40)
[java] at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:87)
[java] javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
[java] at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:739)
[java] at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)
[java] at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038)
[java] at org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:1127)
[java] at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:313)
[java] at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:44)
[java] at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:76)
[java] Caused by: java.io.EOFException: SSL peer shut down incorrectly
[java] at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:321)
[java] at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:720)
[java] ... 6 more
[java] java.net.SocketException: Connection closed by remote host
[java] at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkWrite(SSLSocketImpl.java:1168)
[java] at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:43)
[java] at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
[java] at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:404)
[java] at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:408)
[java] at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
[java] at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
[java] at java.io.BufferedWriter.flush(BufferedWriter.java:236)
[java] at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:274)
[java] at org.jivesoftware.smack.PacketWriter.access$000(PacketWriter.java:40)
[java] at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:87)
[java] java.io.EOFException: no more data available - expected end tag to close start tag from line 1, parser stopped on END_TAG seen ...... @1:342
[java] at org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:3014)
[java] at org.xmlpull.mxp1.MXParser.more(MXParser.java:3025)
[java] at org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1144)
[java] at org.xmlpull.mxp1.MXParser.next(MXParser.java:1093)
[java] at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:368)
[java] at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:44)
[java] at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:76)
While getting these errors, I was able to log partychat@ in to Google Talk via GMail Chat. Running PartyChat on other machines has a little more success, but not really -- half the accounts still die, but a few are able to connect.

Before I chalk this up to some sort of weird rate-limiting issue, I'm hoping someone can give me a more plausible explanation of what be happening. Any ideas?

Thursday, October 04, 2007

Using PartyChat, with pictures

Add partychat#@gmail.com as a contact (where '#' is any number from 0 to 9):





To start a new party chat, think of a partychat name and password and send them in a message:
/make mycoolgroup secretpassword



To invite your friends, give them the name and password.

To join an existing party chat, send this message:
/join mycoolgroup secretpassword



To leave a party chat (not that you'll ever want to), send this:
/leave



Generally you never want to /leave a partychat... that way you can continue receiving messages even after you've closed the window or logged out!

Sunday, May 13, 2007

More features you never asked for

There's been a flurry of changes to PartyChat lately, so I feel the need to shout-out some love to everyone who's been pitching in.
  • Dolapo spends much of his life fantasizing about what it would be like if he were a dinosaur who spoke Perl. Unfortunately for him, he's really really bad at writing regular expressions (I'm not kidding, he's terrible). To compensate, he added a feature so you can now correct your past errors thanks to the power of regexps.
    me: man, Kushal sure is horny today.
      whoops
      s/ho/co/
    partychat: "dolapo" meant man, Kushal sure is corny today
  • I won't lie, a lot of us spend far too much time at work using PartyChat, which isn't much of a productivity boost. Sometimes you really need to focus, so on my behest, Dolapo implemented a /snooze feature which allows you to ignore the inane babble of your friends for a while without having to exit a chat. Just type something like /snooze 45m and then enjoy 45 minutes of productive serenity.

  • Wondering why Dolapo had -56 ++points despite implementing useful features, the ever resourceful Mihai added a /reasons command which prints out the reasons for someone's ++point score
    me: /reasons dolapo
    partychat: dolapo:-56
      increment by steve...@gmail.com
      decrement by ak...@q00p.net (for not helping)
      decrement by ak...@q00p.net (for making my eyes bleed)
      ...
  • Programmers are notoriously bad about writing documentation, and PartyChat developers are no exception. In order to force better hygiene on us, Michael refactored my (ugly, ugly) command parser and made it easier to update the help messages that prints when you type /commands. So thanks to him, you can now learn everything you wanted to know about PartyChat but were too afraid to ask.

Saturday, May 12, 2007

PartyChat's back up!

We had a different issue than we previously though, so I'm happy to say that we're back up earlier than I thought. All your old rooms and ++points should be back.

Wednesday, May 09, 2007

gah!

As you may have noticed, the partychat#@gmail accounts are down right now. Due to a series of SNAFUs, I can't restart them till Monday morning. In the meantime, we have a temporary PartyChat instance running at tahcytrap@gmail.com. You'll have to recreate/rejoin your chat rooms (/make room-name & /join room-name), but hopefully that'll tide you over until I can restart the regular system on Monday.

Sorry about that =/. I feel even worse than the twitter kitty.

P.S. A big thanks to Michael for temp hosting in the meantime!

Thursday, May 03, 2007

PartyChat flakiness

Apologies for the higher-than-average PartyChat flakiness recently, we've hopefully fixed the problem, so things should be stabler moving forward.

The problem, for those who are curious, is that PartyChat uses the Smack library to connect to Google Talk. Google Talk was sending us delayed information (e.g. offline chat) information with poorly formatted time stamps (e.g. "200753T17:56:30") which would cause the connection to die. My friend, and new PartyChat addict, Neil upgraded us to the newest version of Smack in a hurry and turned off the delayed message parser which, for now, seems to have solved the problem.

You also may have stumbled upon a number of unannounced new commands in PartyChat recently -- I hope to post an update explaining how to use these features in detail soon.

Thursday, January 11, 2007

Announcements ahoy

Partychat's convenient alias command lets you chat with an alias instead of your jabber id, but unfortunately does not obey the principle of least surprise. As a result our friend group has too many conversations of the following form:
["dolapo"] i think dan is the greatest.
["realdolapo"] dammit dan, change your alias.
Tired of being the brunt of these sorts of "jokes" I decided to modify partychat to publicly announce changes to chat room state. Now when Dan decides to change his alias, partychat will say xxxxx@gmail.com (dan) is now known as dolapo. This should reduce the amount of frustration in my life while hopefully forcing Dan to step it up in the humor department.