package jinnychat;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import org.apache.http.client.ClientProtocolException;
import org.ccil.cowan.tagsoup.Parser;
import org.json.JSONException;
import org.json.JSONObject;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import su.msk.dunno.httpbot.main.Bot;
import su.msk.dunno.httpbot.prototypes.AModule;
import su.msk.dunno.httpbot.prototypes.Order;
import su.msk.dunno.httpbot.support.Conn;
import su.msk.dunno.httpbot.support.parsers.FormParser;
public class JinnyChat extends AModule
{
private String nickname = "Anonymous";
private JinnyChatGUI gui;
private JSONObject addPostForm;
private JinnyChatParser chatParser = new JinnyChatParser();
//public StringBuffer currentText = new StringBuffer("");
private int from = 0;
private int to = 50;
public JinnyChat()
{
try {
nickname = Bot.getSystemParams().getProperty("nickname");
gui = new JinnyChatGUI();
gui.jLabel_updatingchat.setVisible(true);
Conn.instance().executeGet("http://jinny19861.0fees.net/mcht.php");
addPostForm = FormParser.instance().parse().getJSONObject(0);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override public void doAction()
{
if(gui.isAddPost) addNewPost();
updateChat();
}
@Override protected void executeOrder(Order currentOrder) {}
private void addNewPost()
{
try
{
if(gui.jTextField_nickname.getText() == null || "".equals(gui.jTextField_nickname.getText())) gui.jTextField_nickname.setText("Anonymous");
if(gui.jTextArea_newmessage.getText() != null && !"".equals(gui.jTextArea_newmessage.getText()))
{
String name = gui.jTextField_nickname.getText();
String message = gui.jTextArea_newmessage.getText();
String threadId = gui.jTextField_threadid.getText();
//gui.jLabel_chat.setText(currentText.toString());
addPostForm.put("name", name);
addPostForm.put("msg", message);
addPostForm.put("thread_id", threadId);
Conn.instance().addPostData(addPostForm);
Conn.instance().executePost(addPostForm.getString("link-to-action"));
}
}
catch (JSONException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (java.lang.IllegalArgumentException e) {
// ignore this
}
gui.jTextArea_newmessage.setText("");
gui.jLabel_sendingmessage.setVisible(false);
gui.isAddPost = false;
gui.jLabel_updatingchat.setVisible(true);
}
private void updateChat()
{
try {
from = Integer.valueOf(gui.jTextField_from.getText());
} catch(NumberFormatException e) {
from = 0;
gui.jTextField_from.setText("0");
}
try {
to = Integer.valueOf(gui.jTextField_to.getText());
} catch(NumberFormatException e) {
to = 50;
gui.jTextField_to.setText("50");
}
String threadId = gui.jTextField_threadid.getText();
try
{
Conn.instance().executeGet("http://jinny19861.0fees.net/mcht.php?thread_id="+threadId+"&from="+from+"&to="+to);
String chat = chatParser.parse();
gui.jLabel_chat.setText(chat);
}
catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
gui.jLabel_updatingchat.setVisible(false);
}
class JinnyChatGUI extends JFrame
{
private static final long serialVersionUID = -1670705173282345859L;
private JFrame frame;
private JMenuBar menu;
private JMenu forums;
private JMenuItem item_2ch,item_ochan,item_flocal,item_jchat,item_exit;
private jChatListener jChatListener;
JTextArea jTextArea_newmessage;
private JScrollPane jScrollPane2;
private JTextField jTextField_to;
private JLabel jLabel_to;
private JTextField jTextField_from;
private JLabel jLabel_posts_from;
JTextField jTextField_nickname;
private JLabel jLabel_nickname;
private JScrollPane jScrollPane1;
JLabel jLabel_chat;
private JTextField jTextField_threadid;
private JLabel jLabel_threadid;
JLabel jLabel_sendingmessage;
private JLabel jLabel_updatingchat;
boolean isAddPost = false;
private boolean isCtrlPressed = false;
public JinnyChatGUI() throws Exception
{
super();
initGUI();
}
private void initGUI()
{
try {
frame = new JFrame();
frame.setLayout(null);
jChatListener = new jChatListener(this);
menu = new JMenuBar();
forums = new JMenu("forums");
{
item_2ch = new JMenuItem("2ch");
item_ochan = new JMenuItem("0chan");
item_flocal = new JMenuItem("flocal");
item_jchat = new JMenuItem("jChat");
item_exit = new JMenuItem("exit");
}
{
item_2ch.addActionListener(jChatListener);
item_ochan.addActionListener(jChatListener);
item_flocal.addActionListener(jChatListener);
item_jchat.addActionListener(jChatListener);
item_exit.addActionListener(jChatListener);
}
{
forums.add(item_2ch);
forums.add(item_ochan);
forums.add(item_flocal);
forums.add(item_jchat);
forums.addSeparator();
forums.add(item_exit);
}
menu.add(forums);
// menuBar.add(menuOption());
// menuBar.add(menuInfo());
frame.setJMenuBar(menu);
{
jScrollPane2 = new JScrollPane();
frame.add(jScrollPane2);
jScrollPane2.setBounds(12, 606, 507, 68);
{
jTextArea_newmessage = new JTextArea();
jScrollPane2.setViewportView(jTextArea_newmessage);
jTextArea_newmessage.setBounds(12, 668, 324, 16);
}
}
jTextArea_newmessage.addKeyListener(new KeyListener()
{
public void keyPressed(KeyEvent arg0)
{
switch(arg0.getKeyCode())
{
case KeyEvent.VK_CONTROL:
isCtrlPressed = true;
break;
case KeyEvent.VK_ENTER:
if(isCtrlPressed && !jLabel_sendingmessage.isVisible() && !jLabel_updatingchat.isVisible())
{
isAddPost = true;
jLabel_sendingmessage.setVisible(true);
/* Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
String time = sdf.format(cal.getTime());
currentText.setLength(0);
currentText.append(jLabel_chat.getText());
String current_message = "<font color=red><b>"+jTextField_nickname.getText() +" </b></font>" +
"("+time+") <br>" +
"<font color=#666666 >"+jTextArea_newmessage.getText()+"</font> <br><br>";
jLabel_chat.setText(currentText.insert(6, current_message).toString());*/
}
break;
}
}
public void keyReleased(KeyEvent arg0)
{
switch(arg0.getKeyCode())
{
case KeyEvent.VK_CONTROL:
isCtrlPressed = false;
break;
}
}
public void keyTyped(KeyEvent arg0) {}
});
{
jScrollPane1 = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
frame.add(jScrollPane1);
jScrollPane1.setBounds(12, 12, 507, 547);
{
String imgPath = System.getProperty("user.dir").replace("\\", "/")+"/pics/conata.jpg";
jLabel_chat = new JLabel("<html><div align='center'><img src='file:///"+imgPath+"' /></div>");
jLabel_chat.setVerticalAlignment(JLabel.TOP);
jScrollPane1.setViewportView(jLabel_chat);
jLabel_chat.setBounds(12, 12, 507, 547);
jLabel_chat.setFont(new Font("", Font.PLAIN, 12));
jLabel_chat.setBackground(Color.WHITE);
jLabel_chat.setOpaque(true);
}
jScrollPane1.getVerticalScrollBar().setUnitIncrement(16);
}
{
jLabel_nickname = new JLabel();
frame.add(jLabel_nickname);
jLabel_nickname.setBounds(12, 571, 33, 23);
jLabel_nickname.setText(": ");
}
{
jTextField_nickname = new JTextField();
frame.add(jTextField_nickname);
jTextField_nickname.setBounds(50, 571, 73, 23);
jTextField_nickname.setText(nickname);
}
{
jLabel_sendingmessage = new JLabel();
frame.add(jLabel_sendingmessage);
jLabel_sendingmessage.setBounds(12, 674, 323, 19);
jLabel_sendingmessage.setText(" ...");
jLabel_sendingmessage.setVisible(false);
}
{
jLabel_updatingchat = new JLabel();
frame.add(jLabel_updatingchat);
jLabel_updatingchat.setBounds(12, 674, 323, 19);
jLabel_updatingchat.setText(" ...");
jLabel_updatingchat.setVisible(false);
}
{
jLabel_posts_from = new JLabel();
frame.add(jLabel_posts_from);
jLabel_posts_from.setBounds(129, 571, 67, 23);
jLabel_posts_from.setText(", :");
}
{
jTextField_from = new JTextField();
frame.add(jTextField_from);
jTextField_from.setBounds(195, 571, 30, 23);
}
{
jLabel_to = new JLabel();
frame.add(jLabel_to);
jLabel_to.setBounds(235, 571, 25, 23);
jLabel_to.setText(": ");
}
{
jTextField_to = new JTextField();
frame.add(jTextField_to);
jTextField_to.setBounds(260, 571, 30, 23);
}
{
jLabel_threadid = new JLabel();
frame.add(jLabel_threadid);
jLabel_threadid.setBounds(294, 571, 40, 23);
jLabel_threadid.setText(":");
}
{
jTextField_threadid = new JTextField();
frame.add(jTextField_threadid);
jTextField_threadid.setBounds(334, 571, 185, 23);
jTextField_threadid.setText("main");
}
frame.setTitle("jChat");
frame.setSize(547, 750);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class jChatListener implements ActionListener {
public JinnyChatGUI gui;
private jChatListener(JinnyChatGUI gui)
{
this.gui=gui;
}
private void chatMode()
{
gui.jTextField_nickname.setVisible(true);
gui.jTextField_from.setVisible(true);
gui.jTextField_to.setVisible(true);
gui.jTextField_threadid.setVisible(true);
gui.jTextArea_newmessage.setVisible(true);
gui.jLabel_nickname.setVisible(true);
gui.jLabel_posts_from.setVisible(true);
gui.jLabel_to.setVisible(true);
gui.jLabel_threadid.setVisible(true);
gui.jScrollPane1.setBounds(12, 12, 507, 547);
}
private void forumMode()
{
gui.jTextField_nickname.setVisible(false);
gui.jTextField_from.setVisible(false);
gui.jTextField_to.setVisible(false);
gui.jTextField_threadid.setVisible(false);
gui.jTextArea_newmessage.setVisible(false);
gui.jLabel_nickname.setVisible(false);
gui.jLabel_posts_from.setVisible(false);
gui.jLabel_to.setVisible(false);
gui.jLabel_threadid.setVisible(false);
gui.jScrollPane1.setBounds(12, 12, 507, 590);
}
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if (arg0.getSource()==gui.item_2ch)
{
forumMode();
//Con link
//handler for parser
}
if (arg0.getSource()==gui.item_ochan)
{
forumMode();
//Con link
//handler for parser
}
if (arg0.getSource()==gui.item_flocal)
{
forumMode();
//Con link
//handler for parser
}
if (arg0.getSource()==gui.item_jchat)
{
chatMode();
//Con link
//handler for parser
}
if (arg0.getSource()==gui.item_exit)
{
System.exit(0);
}
}
}
}
class JinnyChatParser
{
private JinnyChatHandler h;
private Parser parser = new Parser();
public String parse() throws IOException, SAXException, JSONException
{
return parse(new String(Conn.instance().currentHtml));
}
public String parse(String html) throws IOException, SAXException, JSONException
{
h = new JinnyChatHandler();
parser.setContentHandler(h);
parser.parse(new InputSource(new StringReader(html)));
return h.getParsed();
}
}
class JinnyChatHandler extends DefaultHandler
{
private StringBuilder chatData = new StringBuilder("<html>");
private int obtainStatus = 0;
private StringBuilder nickname = new StringBuilder();
private StringBuilder date = new StringBuilder();
private StringBuilder message = new StringBuilder();
public void startElement(String uri,
String local_name,
String raw_name,
Attributes amap) throws SAXException
{
if("div".equalsIgnoreCase(raw_name))
{
String id = amap.getValue("id");
if("name".equalsIgnoreCase(id)) obtainStatus = 1; // nickname
else if("date".equalsIgnoreCase(id)) obtainStatus = 2; // date
else if("msg".equalsIgnoreCase(id)) obtainStatus = 3; // message
}
}
public void characters(char[] ch, int start, int length) throws SAXException
{
String value = new String(ch, start, length);
switch(obtainStatus)
{
case 1: nickname.append(value); break;
case 2: date.append(value); break;
case 3: message.append(value); break;
}
}
public void endElement(String uri,
String local_name,
String raw_name) throws SAXException
{
if("div".equalsIgnoreCase(raw_name) && obtainStatus == 3)
{
chatData.append("<font color=red><b>"+nickname.toString().replace("\n", "").replace("\t", "")+" </b></font>"+
"("+date.toString().replace("\n", "").replace("\t", "")+")<br>"+
"<font color=#666666 >"+ addEnters(removeEdgeSpecials(message)).replace("\n", "<br/>")+"</font> <br/> <br>");
obtainStatus = 0;
nickname = new StringBuilder();
date = new StringBuilder();
message = new StringBuilder();
}
}
private String removeEdgeSpecials(StringBuilder sb)
{
int start = 0;
int end = 0;
int i = 0;
while(i < sb.length() && (sb.charAt(i) == '\n' || sb.charAt(i) == '\t')) i++;
start = i;
i = sb.length()-1;
while(i >= 0 && (sb.charAt(i) == '\n' || sb.charAt(i) == '\t')) i--;
end = i;
return sb.substring(start, end);
}
private String addEnters(String message)
{
if(message.length() > 58)
{
int space = findInt(message);
if(space != 0) message = message.substring(0, space).replace("\n", " ") + "<br/>" + addEnters(message.substring(space));
}
return message;
}
private int findInt(String message)
{
if(message.length() > 58)
{
if(message.substring(0, 58).contains("\n\n")) return 0;
for(int i = 58; i >= 0; i--)
{
char c = message.charAt(i);
if(c == ' ') return i;
}
}
return 0;
}
public String getParsed()
{
return chatData.toString();
}
}
|