Skip to content

Instantly share code, notes, and snippets.

@tarchan
Created October 9, 2009 05:23
Show Gist options
  • Save tarchan/205732 to your computer and use it in GitHub Desktop.
Save tarchan/205732 to your computer and use it in GitHub Desktop.
JJUG CCC 2009 Fall
/*
* Copyright (c) 2009 tarchan. All rights reserved.
*/
package com.mac.tarchan.tweet;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Window;
import java.io.IOException;
import java.util.prefs.Preferences;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.ButtonGroup;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.JToggleButton;
import javax.swing.GroupLayout.Alignment;
import javax.swing.GroupLayout.ParallelGroup;
import com.mac.tarchan.desktop.ActionQuery;
import com.mac.tarchan.desktop.AquaControl;
import com.mac.tarchan.desktop.ConfigPit;
import com.mac.tarchan.desktop.DesktopSupport;
import com.mac.tarchan.net.irc.client.IRCClient;
import com.mac.tarchan.net.irc.client.IRCMessage;
import com.mac.tarchan.net.irc.client.Reply;
import twitter4j.DirectMessage;
import twitter4j.Twitter;
import twitter4j.TwitterException;
/**
* IRCTweetは、IRCでつぶやかれたキーワードをTwitterにDMします。
*
* @author tarchan@gmail.com
*/
public class IRCTweet
{
/** ウインドウ */
JFrame window;
/** IRCクライアント */
IRCClient irc;
/**
* IRCTweet を起動します。
*
* @param args なし
*/
public static void main(String[] args)
{
AquaControl.setAppleMenuName("IRCTweet");
AquaControl.useScreenMenuBar();
DesktopSupport.useSystemProxies();
DesktopSupport.useSystemLookAndFeel();
DesktopSupport.windowVisible(new IRCTweet().createWindow());
}
/**
* ウインドウを作成します。
*
* @return ウインドウ
*/
Window createWindow()
{
// ウインドウを作成
window = new JFrame("IRCTweet");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(500, 300);
window.add(createMainComponent(), BorderLayout.CENTER);
window.add(createFooterComponent(), BorderLayout.SOUTH);
// イベントハンドラを登録
ActionQuery.ready(window).button().click(this);
return window;
}
/**
* メインパネルを作成します。
*
* @return メインパネル
*/
Component createMainComponent()
{
// 入力項目を作成
JLabel label = new JLabel("キーワード:");
label.setToolTipText("キーワードをスペース区切りで複数設定します。");
JTextPane text = new JTextPane();
text.setName("keywords");
text.setToolTipText("キーワードをスペース区切りで複数設定します。");
JScrollPane scroll = new JScrollPane(text, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// レイアウト
JPanel main = new JPanel();
main.setName("main");
GroupLayout layout = new GroupLayout(main);
main.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
// 垂直グループ
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
layout.setVerticalGroup(vGroup);
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(label));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(scroll));
// 水平グループ
GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
layout.setHorizontalGroup(hGroup);
ParallelGroup fieldGroup = layout.createParallelGroup();
hGroup.addGroup(fieldGroup);
fieldGroup.addComponent(label);
fieldGroup.addComponent(scroll);
return main;
}
/**
* フッターパネルを作成します。
*
* @return フッターパネル
*/
Component createFooterComponent()
{
// ボタンを作成
JToggleButton startTweet = new JToggleButton ("つぶやき開始");
startTweet.setName("startTweet");
startTweet.setToolTipText("IRCに接続します。");
JToggleButton stopTweet = new JToggleButton ("つぶやき停止");
stopTweet.setName("stopTweet");
stopTweet.setToolTipText("IRCを切断します。");
// ボタングループを作成
ButtonGroup group = new ButtonGroup();
group.add(startTweet);
group.add(stopTweet);
group.setSelected(stopTweet.getModel(), true);
AquaControl.setSegmentButtonGroup(group, AquaControl.JBUTTON_TYPE_SEGMENTED);
// レイアウト
JPanel footer = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
footer.setName("footer");
footer.add(startTweet);
footer.add(stopTweet);
return footer;
}
/**
* つぶやきを開始します。
*
* @see #onMessage(IRCMessage)
*/
public void startTweet()
{
System.out.println("つぶやき開始");
// 設定を取得
Preferences config = ConfigPit.load("freenode.net");
String host = config.get("host", "");
int port = config.getInt("port", 6667);
String channel = config.get("channel", "");
String encoding = config.get("encoding", "");
String nick = config.get("nick", "");
// config.put("host", "irc.freenode.net");
// config.put("port", "6667");
// config.put("channel", "#java-ja");
// config.put("encoding", "utf8");
// config.put("nick", "tarchan");
try
{
// IRCハンドラの設定
irc = new IRCClient().addAllHandlers(this);
// IRC接続
irc.setProperty("irc.channel", channel);
irc.setProperty("irc.encoding", encoding);
irc.setProperty("irc.nick.name", nick);
irc.open(host, port);
}
catch (IOException x)
{
x.printStackTrace();
}
}
/**
* つぶやきを停止します。
*/
public void stopTweet()
{
System.out.println("つぶやき停止");
if (irc != null)
{
irc.quit("Stop IRCTweet");
irc = null;
}
// String input = "java-jaから来ました。";
// onMessage(input);
}
/**
* キーワードが含まれているか判定します。
*
* @param keywords キーワード
* @param input 入力テキスト
* @return キーワードが含まれている場合は true
*/
boolean findKeyword(String keywords, String input)
{
// キーワードが空の場合は false
if (keywords == null || keywords.trim().length() == 0) return false;
// スペース区切りで正規表現に変換
keywords = "(" + keywords.replaceAll(" ", "|") + ")";
Pattern p = Pattern.compile(keywords);
Matcher m = p.matcher(input);
return m.find();
}
/**
* キーワードが含まれている場合は、メッセージを送信します。
*
* @param message メッセージ
* @see #sendMessage(String)
*/
@Reply("PRIVMSG")
public void onMessage(IRCMessage message)
{
// IRCメッセージを取得
String input = message.getTrail();
// テキストエリアのキーワードを取得
String keywords = ActionQuery.ready(window).find("keywords").text();
// キーワードにマッチしたら送信
if (findKeyword(keywords, input)) sendMessage(input);
}
/**
* Twitterにメッセージを送信します。
*
* @param message メッセージ
* @see #onMessage(IRCMessage)
*/
public void sendMessage(String message)
{
// 設定を取得
Preferences config = ConfigPit.load("twitter.com");
String id = config.get("id", "");
String password = config.get("password", "");
try
{
Twitter twitter = new Twitter(id, password);
DirectMessage dm = twitter.sendDirectMessage(id, message);
System.out.format("sent to %s (%s)\n", dm.getRecipientScreenName(), dm.getRecipient().getName());
}
catch (TwitterException x)
{
x.printStackTrace();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment