Created
October 9, 2009 05:23
-
-
Save tarchan/205732 to your computer and use it in GitHub Desktop.
JJUG CCC 2009 Fall
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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 [email protected] | |
*/ | |
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