TwitterGateway.java Source code

Java tutorial

Introduction

Here is the source code for TwitterGateway.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import twitter4j.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.logging.Level;

public final class TwitterGateway implements StatusListener {
    public static final String screenName = "@KvinIink";
    private String user;
    private String location[];
    private String latlon[] = new String[2];
    private RoutingResponse routingResponse;
    private Step[] step;
    private Steps steps;
    DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    Date date = new Date();

    @Override
    public void onStatus(Status status) {
        user = status.getUser().getScreenName();

        String mentionStatus = status.getText();
        System.out.println("@" + user + " - " + mentionStatus);
        String paramScreenName = screenName.toLowerCase();
        mentionStatus = mentionStatus.toLowerCase().replace(paramScreenName, "").trim();
        String locale = new String();
        if (mentionStatus.contains(" to ")) {
            location = mentionStatus.split(" to ");
            locale = "en";
        } else if (mentionStatus.contains(" ke ")) {
            location = mentionStatus.split(" ke ");
            locale = "id";
        } else {
            location = null;
        }
        boolean statusLocation1 = false;
        boolean statusLocation2 = false;

        if (mentionStatus.equals("help") || mentionStatus.equals(("bantuan"))) {
            try {
                if (mentionStatus.equals("help")) {
                    Tweet(user,
                            "For using this Twitter bot for searching public transport route, you can mention...");
                    Tweet(user, "'First location' to 'second location', example : BIP to PVJ");
                } else {
                    Tweet(user, "Format penggunaan Twitter bot untuk mencari jalur transportasi publik adalah...");
                    Tweet(user, "'Lokasi awal' ke 'lokasi tujuan', contoh : BIP ke PVJ.");
                }
            } catch (TwitterException ex) {
                System.out.println("Tweet help error");
            }
        } else if (location.length == 2 && !location[0].contains("@") && !location[1].contains("@")) {
            try {
                if (location[0].equals(location[1])) {
                    if (locale.equals("id")) {
                        Tweet(user, "Pencarian tidak dapat dilakukan karena lokasi awal dan lokasi tujuan sama");
                    } else if (locale.equals("en")) {
                        Tweet(user, "Route can't be found. Starting location and destination are similar");
                    }
                } else {
                    System.out.println("Lokasi 1 : " + location[0].trim());
                    System.out.println("Lokasi 2 : " + location[1].trim());
                    //string destination menampung hasil dari JSONObject hasil pencarian apa saja yang ditemukan dari KIRIGateway.getLatLong
                    String destination1 = KIRIGateway.GetLatLong(location[0]);
                    String destination2 = KIRIGateway.GetLatLong(location[1]);

                    //dimasukan ke JSONObject 
                    JSONObject objDest1 = new JSONObject(destination1);
                    JSONObject objDest2 = new JSONObject(destination2);

                    //memasukan hasil pencarian pertama dari JSONObject ke abribut routingResponse
                    JSONObject res1 = objDest1.getJSONArray("searchresult").getJSONObject(0);
                    String hasilDest1 = res1.getString("placename");
                    latlon[0] = res1.getString("location");
                    if (hasilDest1 != null) {
                        statusLocation1 = true;
                    }

                    JSONObject res2 = objDest2.getJSONArray("searchresult").getJSONObject(0);
                    String hasilDest2 = res2.getString("placename");
                    latlon[1] = res2.getString("location");
                    if (hasilDest2 != null) {
                        statusLocation2 = true;
                    }

                    //Mendapatkan hasil pencarian lalu dimasukan ke JSONArray paramSteps untuk dipisah-pisah lalu dimasukan ke RoutingResponse
                    String hasilPencarian = KIRIGateway.GetTrack(latlon[0], latlon[1], locale);
                    JSONObject objTrack = new JSONObject(hasilPencarian);
                    JSONObject routingresults = objTrack.getJSONArray("routingresults").getJSONObject(0);
                    JSONArray paramSteps = routingresults.getJSONArray("steps");
                    //buat variable step, steps, dan routing response
                    step = new Step[paramSteps.length()];
                    for (int i = 0; i < step.length; i++) {
                        step[i] = new Step(paramSteps.getJSONArray(i).getString(3) + "");
                    }
                    steps = new Steps(step);

                    routingResponse = new RoutingResponse(objTrack.getString("status"), steps);
                    if (routingResponse.getStatus().equals("ok")) {
                        for (int i = 0; i < routingResponse.getRoutingResult().getSteps().length; i++) {
                            date = new Date();
                            Tweet(user, routingResponse.getRoutingResult().getSteps()[i].getHumanDescription());
                        }
                        if (locale.equals("id")) {
                            Tweet(user,
                                    "Untuk lebih lengkapnya dapat dilihat pada http://kiri.travel?start="
                                            + location[0].replace(" ", "%20") + "&finish="
                                            + location[1].replace(" ", "%20") + "&region=bdo");
                        } else if (locale.equals("en")) {
                            Tweet(user,
                                    "For futher information you can visit http://kiri.travel?start="
                                            + location[0].replace(" ", "%20") + "&finish="
                                            + location[1].replace(" ", "%20") + "&region=bdo");
                        }

                        for (int i = 0; i < routingResponse.getRoutingResult().getSteps().length; i++) {
                            System.out.println("@" + user + " "
                                    + routingResponse.getRoutingResult().getSteps()[i].getHumanDescription());
                        }
                        System.out.println(
                                "@" + user + " Untuk lebih lengkap silahkan lihat di http://kiri.travel?start="
                                        + location[0].replace(" ", "%20") + "&finish="
                                        + location[1].replace(" ", "%20") + "&region=bdo");
                    } else {
                        System.out.println("status error");
                    }
                }
            } catch (Exception ex) {
                try {
                    if (!statusLocation1) {
                        date = new Date();
                        Tweet(user, location[0] + " tidak ditemukan");
                        System.out.println("@" + user + " " + location[0] + " tidak ditemukan");
                    } else if (!statusLocation2) {
                        date = new Date();
                        Tweet(user, location[1] + " tidak ditemukan");
                        System.out.println("@" + user + " " + location[1] + " tidak ditemukan");
                    } else {
                        date = new Date();
                        Tweet(user, "Gangguan Koneksi");
                        System.out.println("Gangguan Koneksi");
                    }
                    //java.util.logging.Logger.getLogger(TwitterGateway.class.getName()).log(Level.SEVERE, null, ex);
                } catch (TwitterException ex1) {
                    System.out.println("Error2");
                    java.util.logging.Logger.getLogger(TwitterGateway.class.getName()).log(Level.SEVERE, null, ex1);
                }
            }
        }

    }

    @Override
    public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
        System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId());
    }

    @Override
    public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
        System.out.println("Got track limitation notice:" + numberOfLimitedStatuses);
    }

    @Override
    public void onScrubGeo(long userId, long upToStatusId) {
        System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId);
    }

    @Override
    public void onException(Exception ex) {
        System.out.println("onException");
        ex.printStackTrace();
    }

    @Override
    public void onStallWarning(StallWarning sw) {
        System.out.println("onStallWarning");
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    public void Tweet(String user, String paramStatusUpdate) throws TwitterException {
        Twitter twitter = new TwitterFactory().getInstance();
        int userLength = user.length();
        int maxTweet = 140 - (userLength + 2 + 9); // ditambah 2 untuk @ dan " ", ditambah 9 untuk waktu " HH:mm:ss";

        String[] tampung = paramStatusUpdate.split(" ", 0); //misahin semua kata jadi array of kata

        StatusUpdate[] statusUpdate = new StatusUpdate[(paramStatusUpdate.length() / maxTweet) + 1]; //panjang status dibagi batas maksimal huruf yang diperbolehkan, ditambah 1 karena 130/140 = 0
        String[] tampungStatusUpdate = new String[statusUpdate.length]; //bikin banyaknya array sepanjang tweet yang mau di tweet

        int increment = 0;
        int incTampung = 0;
        for (int i = 0; i < tampungStatusUpdate.length; i++) {
            tampungStatusUpdate[i] = "@" + user + " "; //setiap tweet harus dimasukin nama user yang dituju
        }

        while (increment < statusUpdate.length) {

            while (incTampung < tampung.length) {
                tampungStatusUpdate[increment] += tampung[incTampung]; //nambahin kata
                if (tampungStatusUpdate[increment].length() >= 131) { //melakukan cek apakah tweet sudah over 140 kata atau belom, 131 soalnya 140 dikurang 9 untuk waktu " HH:mm:ss";

                    tampungStatusUpdate[increment] = tampungStatusUpdate[increment].substring(0,
                            tampungStatusUpdate[increment].length() - tampung[incTampung].length()); //ngebuang kata terakhir yang ditambahin
                    tampungStatusUpdate[increment] += " " + dateFormat.format(date);
                    System.out.println(tampungStatusUpdate[increment]);
                    increment++;
                    //tampungStatusUpdate[increment] += tampung[incTampung] + " "; //kata yang tadi dibuang dimasukin lagi ke tampungStatusUpdate index selanjutnya
                    break;
                } else {
                    tampungStatusUpdate[increment] += " "; //Jika belum 140 kata maka ditambahkan spasi
                }
                incTampung++;
                if (incTampung >= tampung.length) {
                    tampungStatusUpdate[increment] += " " + dateFormat.format(date);
                    System.out.println(tampungStatusUpdate[increment]);
                    increment++; //kalo kata-kata sudah habis, keluarin dari statement
                }
            }
        }

        for (int i = 0; i < statusUpdate.length; i++) {
            statusUpdate[i] = new StatusUpdate(tampungStatusUpdate[i]);
        }
        try {
            for (int i = 0; i < statusUpdate.length; i++) {
                twitter.updateStatus(statusUpdate[i]);
            }
        } catch (TwitterException ex) {
            twitter.updateStatus("@" + user + " Maaf anda sudah penah melakukan pencarian ini sebelumnya. "
                    + dateFormat.format(date));
            System.out.println("Error : " + ex);
        }
    }

    public void Tweet2(String user, String paramStatusUpdate) throws TwitterException {
        Twitter twitter = new TwitterFactory().getInstance();
        int userLength = user.length();
        int maxTweet = 140 - (userLength + 2); // ditambah 2 untuk @ dan " ", ditambah 9 untuk waktu " HH:mm:ss";

        String[] tampung = paramStatusUpdate.split(" ", 0); //misahin semua kata jadi array of kata

        StatusUpdate[] statusUpdate = new StatusUpdate[(paramStatusUpdate.length() / maxTweet) + 1]; //panjang status dibagi batas maksimal huruf yang diperbolehkan, ditambah 1 karena 130/140 = 0
        String[] tampungStatusUpdate = new String[statusUpdate.length]; //bikin banyaknya array sepanjang tweet yang mau di tweet

        int increment = 0;
        int incTampung = 0;
        for (int i = 0; i < tampungStatusUpdate.length; i++) {
            tampungStatusUpdate[i] = "@" + user + " "; //setiap tweet harus dimasukin nama user yang dituju
        }

        while (increment < statusUpdate.length) {

            while (incTampung < tampung.length) {
                tampungStatusUpdate[increment] += tampung[incTampung]; //nambahin kata
                if (tampungStatusUpdate[increment].length() >= 140) { //melakukan cek apakah tweet sudah over 140 kata atau belom, 131 soalnya 140 dikurang 9 untuk waktu " HH:mm:ss";

                    tampungStatusUpdate[increment] = tampungStatusUpdate[increment].substring(0,
                            tampungStatusUpdate[increment].length() - tampung[incTampung].length()); //ngebuang kata terakhir yang ditambahin
                    System.out.println(tampungStatusUpdate[increment]);
                    increment++;
                    //tampungStatusUpdate[increment] += tampung[incTampung] + " "; //kata yang tadi dibuang dimasukin lagi ke tampungStatusUpdate index selanjutnya
                    break;
                } else {
                    tampungStatusUpdate[increment] += " "; //Jika belum 140 kata maka ditambahkan spasi
                }
                incTampung++;
                if (incTampung >= tampung.length) {
                    System.out.println(tampungStatusUpdate[increment]);
                    increment++; //kalo kata-kata sudah habis, keluarin dari statement
                }
            }
        }

        for (int i = 0; i < statusUpdate.length; i++) {
            statusUpdate[i] = new StatusUpdate(tampungStatusUpdate[i]);
        }
        try {
            for (int i = 0; i < statusUpdate.length; i++) {
                twitter.updateStatus(statusUpdate[i]);
            }
        } catch (TwitterException ex) {
            twitter.updateStatus("@" + user + " Maaf anda sudah penah melakukan pencarian ini sebelumnya. ");
            System.out.println("Error : " + ex);
        }
    }
}