package org.myrobotlab.service;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import javax.imageio.ImageIO;
import org.myrobotlab.framework.Service;
import org.myrobotlab.framework.ServiceType;
import org.myrobotlab.image.SerializableImage;
import org.myrobotlab.logging.Level;
import org.myrobotlab.logging.LoggerFactory;
import org.myrobotlab.logging.Logging;
import org.myrobotlab.logging.LoggingFactory;
import org.slf4j.Logger;
import twitter4j.Status;
import twitter4j.StatusUpdate;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.conf.ConfigurationBuilder;
/**
*
* Twitter - a service that allows you to send a tweet from MRL assuming you
* have a consumerKey and accessToken from a twitter account.
*
*/
public class Twitter extends Service {
private static final long serialVersionUID = 1L;
public final static Logger log = LoggerFactory.getLogger(Twitter.class.getCanonicalName());
public String consumerKey;
public String consumerSecret;
public String accessToken;
public String accessTokenSecret;
twitter4j.Twitter twitter = null;
public static void main(String[] args) {
LoggingFactory.init(Level.WARN);
try {
Twitter twitter = new Twitter("twitter");
twitter.startService();
Runtime.createAndStart("gui", "GUIService");
twitter.setSecurity("xxx", "xxx", "xxx", "xxx");
twitter.configure();
twitter.tweet("Ciao from MyRobotLab");
// twitter.uploadPic("C:/Users/ALESSANDRO/Desktop/myrobotlab/opencv.jpg"
// , "here is the pic");
/*
* OpenCV opencv = new OpenCV("opencv"); opencv.startService();
* opencv.capture(); Service.sleep(4000);// wait for an image
* SerializableImage img = opencv.getDisplay(); twitter.uploadImage(img,
* "ME TOO!");
*/
// twitter.subscribe("publishDisplay", opencv.getName(),
// "uploadImage",
// SerializableImage.class);
/*
* GUIService gui = new GUIService("gui"); gui.startService();
*/
} catch (Exception e) {
Logging.logError(e);
}
}
/**
* Static list of third party dependencies for this service. The list will be
* consumed by Ivy to download and manage the appropriate resources
*
* @return
*/
public Twitter(String n) {
super(n);
}
public void configure() {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true).setOAuthConsumerKey(consumerKey).setOAuthConsumerSecret(consumerSecret).setOAuthAccessToken(accessToken).setOAuthAccessTokenSecret(accessTokenSecret);
TwitterFactory tf = new TwitterFactory(cb.build());
twitter = tf.getInstance();
}
@Override
public void releaseService() {
super.releaseService();
}
public void setSecurity(String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) {
this.consumerKey = consumerKey;
this.consumerSecret = consumerSecret;
this.accessToken = accessToken;
this.accessTokenSecret = accessTokenSecret;
configure();
}
@Override
public void stopService() {
super.stopService();
}
public void tweet(String msg) {
try {
Status status = twitter.updateStatus(msg);
// TODO: invoke or publish this maybe?
log.info("Tweet Status Response: {}", status);
} catch (TwitterException e) {
error(e.getMessage());
Logging.logError(e);
}
}
public void uploadImage(final SerializableImage image, final String message) {
new Thread(new Runnable() {
@Override
public void run() {
try {
StatusUpdate status = new StatusUpdate(message);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image.getImage(), "png", baos);
baos.flush();
byte[] buffer = baos.toByteArray();
status.media("image", new ByteArrayInputStream(buffer));
twitter.updateStatus(status);
} catch (Exception e) {
Logging.logError(e);
}
}
}).start();
}
public void uploadImageFile(final String filePath, final String message) {
new Thread(new Runnable() {
@Override
public void run() {
try {
File file = new File(filePath);
StatusUpdate status = new StatusUpdate(message);
status.setMedia(file);
twitter.updateStatus(status);
} catch (TwitterException e) {
Logging.logError(e);
}
}
}).start();
}
/**
* This static method returns all the details of the class without it having
* to be constructed. It has description, categories, dependencies, and peer
* definitions.
*
* @return ServiceType - returns all the data
*
*/
static public ServiceType getMetaData() {
ServiceType meta = new ServiceType(Twitter.class.getCanonicalName());
meta.addDescription("Service which can relay tweets");
meta.addCategory("cloud", "connectivity");
meta.addDependency("org.twitter4j.twitter", "3.0.5");
return meta;
}
}