private int generateMessageImage(
     String messageSrc, List<String> keywords, String author, String fileName) throws Exception {
   long time = System.currentTimeMillis();
   TwitterMessage message = new TwitterMessage(messageSrc, author, keywords);
   List<TwitterMessageToken> tokens = message.toTokens();
   int width =
       PPMFactory.createAndSave(fileName, tokens, toRGB(configuration.getBackgroundColor()));
   LOG.info("Prepared ppm for {} in {} ms", fileName, (System.currentTimeMillis() - time));
   return width;
 }
  @Override
  public void onDirectMessage(DirectMessage directMessage) {
    Debug.logln(
        "TwitterServer.onDirectMessage sender: "
            + directMessage.getSenderScreenName()
            + " recipient: "
            + directMessage.getRecipientScreenName()
            + " text: "
            + directMessage.getText());

    if (directMessage.getSenderId() == this.ownerID) {
      return; // outgoing message
    }

    // incoming message
    String text = directMessage.getText();
    String sender = directMessage.getSenderScreenName();
    String recipient = directMessage.getRecipientScreenName();

    // Detect trackback
    Trackback trackback = null;
    try {
      trackback = TrackbackStore.getInstance().loadByIncomingText(Channel.TWITTER, sender, text);
    } catch (Exception e) {
      LogEntryStore.log(e);
    }
    if (trackback == null) {
      // !$! Send back error message?
      return;
    }

    // Dispatch event
    TwitterMessage msg = new TwitterMessage();
    msg.setDestination(recipient);
    msg.setSender(sender);
    msg.write(TrackbackStore.getInstance().cleanIncomingText(text));

    this.listener.onTwitterReceived(msg, trackback.getExternalID());
  }