gMIRC_handler.java Source code

Java tutorial

Introduction

Here is the source code for gMIRC_handler.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 com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import gMIRC.ResCode;
import gMIRC.UpdateString;
import gMIRC.grpcMIRCGrpc;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.json.simple.JSONObject;
import org.json.simple.JSONArray;

import gMIRC.Username;
import gMIRC.UserChannel;
import gMIRC.UserMessage;
import io.grpc.stub.StreamObserver;

/**
 *
 * @author Jonathan
 */
public class gMIRC_handler implements grpcMIRCGrpc.grpcMIRC {

    @Override
    public void join(gMIRC.UserChannel request, io.grpc.stub.StreamObserver<gMIRC.ResCode> responseObserver) {
        int responseCode = AddChannel(request.getUsername(), request.getChannelname());
        ResCode reply = ResCode.newBuilder().setResponseCode(responseCode).build();
        responseObserver.onValue(reply);
        responseObserver.onCompleted();
    }

    @Override
    public void regUser(Username request, StreamObserver<ResCode> responseObserver) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        int responseCode = AddUser(request.getUsername());
        ResCode reply = ResCode.newBuilder().setResponseCode(responseCode).build();
        responseObserver.onValue(reply);
        responseObserver.onCompleted();
    }

    @Override
    public void leave(UserChannel request, StreamObserver<ResCode> responseObserver) {
        int responseCode = DeleteChannelUser(request.getChannelname(), request.getUsername());
        ResCode reply = ResCode.newBuilder().setResponseCode(responseCode).build();
        responseObserver.onValue(reply);
        responseObserver.onCompleted();
    }

    @Override
    public void exit(Username request, StreamObserver<ResCode> responseObserver) {
        System.out.println(request.getUsername() + " exiting...");
        ResCode reply = ResCode.newBuilder().setResponseCode(SoftDelete(request.getUsername())).build();
        responseObserver.onValue(reply);
        responseObserver.onCompleted();
    }

    @Override
    public void message(UserMessage request, StreamObserver<ResCode> responseObserver) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        int ret = 0;
        if (request.getChannelname().equalsIgnoreCase("*")) {
            ret = PutMessageWild(request.getUsername(), request.getMsg());
        } else {
            ret = PutMessage(request.getUsername(), request.getChannelname(), request.getMsg());
        }
        ResCode reply = ResCode.newBuilder().setResponseCode(ret).build();
        responseObserver.onValue(reply);
        responseObserver.onCompleted();

    }

    @Override
    public void regularUpdates(Username request, StreamObserver<UpdateString> responseObserver) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        String ret = GetMessage(request.getUsername());
        UpdateString reply = UpdateString.newBuilder().setNewMessages(ret).build();
        responseObserver.onValue(reply);
        responseObserver.onCompleted();

    }

    /**
     * Add a user to a channel (can check if the channel is a new channel)
     *
     * @param Username
     * @param Channel
     * @return code
     */
    private int AddChannel(String Username, String Channel) {
        int ret = 0;
        try {

            MongoClient mongoClient = new MongoClient();
            DB db = mongoClient.getDB("mirc");
            DBCollection coll = db.getCollection("channelCollection");
            BasicDBObject query = new BasicDBObject("username", Username).append("channel", Channel);

            DBCursor cursor = coll.find(query);

            try {
                if (cursor.hasNext()) {
                    ret = 1;
                    System.err.println(Username + " has joined Channel : " + Channel + "!");
                } else {
                    query = new BasicDBObject("channel", Channel);
                    DBCursor cursor2 = coll.find(query);
                    try {
                        if (!cursor2.hasNext()) {
                            ret = 2;
                        }
                    } finally {
                        cursor2.close();
                    }
                    BasicDBObject doc = new BasicDBObject("username", Username).append("channel", Channel);
                    coll.insert(doc);
                    System.out.println(Username + " joined Channel : " + Channel);
                }
            } finally {
                cursor.close();
            }

        } catch (UnknownHostException ex) {
            Logger.getLogger(gMIRC_handler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ret;
    }

    /**
     * Delete a user from a channel (used in leave method)
     *
     * @param Channel
     * @param Username
     * @return code
     */
    private int DeleteChannelUser(String Channel, String Username) {
        int ret = 0;
        try {

            MongoClient mongoClient = new MongoClient();
            DB db = mongoClient.getDB("mirc");
            DBCollection coll = db.getCollection("channelCollection");
            BasicDBObject query = new BasicDBObject("username", Username).append("channel", Channel);

            DBCursor cursor = coll.find(query);

            try {
                ret = 1;
                while (cursor.hasNext()) {
                    ret = 1;
                    coll.remove(cursor.next());
                    ret = 0;
                }
            } finally {
                cursor.close();
            }

        } catch (UnknownHostException ex) {
            Logger.getLogger(gMIRC_handler.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println(Username + " has leaved Channel : " + Channel);
        return ret;
    }

    /**
     * Delete a user in all channel (used in cleaning)
     *
     * @param Username
     * @return code
     */
    public int DeleteUserInChannel(String Username) {
        int ret = 0;
        try {

            MongoClient mongoClient = new MongoClient();
            DB db = mongoClient.getDB("mirc");
            DBCollection coll = db.getCollection("channelCollection");
            BasicDBObject query = new BasicDBObject("username", Username);

            DBCursor cursor = coll.find(query);

            try {
                while (cursor.hasNext()) {
                    coll.remove(cursor.next());
                }
            } finally {
                cursor.close();
            }

        } catch (UnknownHostException ex) {
            Logger.getLogger(gMIRC_handler.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println(Username + " has been deleted in Channel Collection!");
        return ret;
    }

    /**
     * Register a user to the server (used in RegUser)
     *
     * @param username
     * @return code
     */
    private int AddUser(String username) {
        int ret = 0;
        try {

            MongoClient mongoClient = new MongoClient();
            DB db = mongoClient.getDB("mirc");
            DBCollection coll = db.getCollection("activeUser");
            BasicDBObject query = new BasicDBObject("username", username);

            DBCursor cursor = coll.find(query);

            try {
                if (cursor.hasNext()) {
                    Date now = new Date();
                    long timestamp_now = now.getTime();
                    long treshold = timestamp_now - (1000 * 10); //10
                    BasicDBObject temp = (BasicDBObject) cursor.next();
                    Date time_temp = (Date) temp.get("timestamp");
                    long timestamp_temp = time_temp.getTime();
                    if (timestamp_temp < treshold) {
                        ret = 2;
                        System.out.println(username + " has joined back!");
                    } else {
                        ret = 1;
                        System.err.println(username + " has been used !");
                    }
                } else {
                    java.util.Date date = new java.util.Date();
                    BasicDBObject doc = new BasicDBObject("username", username).append("timestamp", date);
                    coll.insert(doc);
                    System.out.println(username + " online !");
                }
            } finally {
                cursor.close();
            }

        } catch (UnknownHostException ex) {
            Logger.getLogger(gMIRC_handler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ret;
    }

    private int UpdateLastActive(String username) {
        int ret = 0;
        try {

            MongoClient mongoClient = new MongoClient();
            DB db = mongoClient.getDB("mirc");
            DBCollection coll = db.getCollection("activeUser");
            BasicDBObject query = new BasicDBObject("username", username);

            DBCursor cursor = coll.find(query);

            try {
                if (cursor.hasNext()) {
                    DBObject temp = cursor.next();
                    java.util.Date date = new java.util.Date();
                    temp.put("timestamp", date);
                    coll.save(temp);
                } else {
                    java.util.Date date = new java.util.Date();
                    BasicDBObject doc = new BasicDBObject("username", username).append("timestamp", date);
                    coll.insert(doc);
                    System.out.println(username + " online !");
                }
            } finally {
                cursor.close();
            }

        } catch (UnknownHostException ex) {
            Logger.getLogger(gMIRC_handler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return 0;
    }

    /**
     * Moved active user to a passive user (soon to be deleted)
     *
     * @param username
     * @return code
     */
    public static int SoftDelete(String username) {
        int ret = 0;
        try {
            MongoClient mongoClient = new MongoClient();
            DB db = mongoClient.getDB("mirc");
            DBCollection coll = db.getCollection("activeUser");
            DBCollection coll2 = db.getCollection("passiveUser");
            BasicDBObject query = new BasicDBObject("username", username);

            DBCursor cursor = coll.find(query);

            try {
                if (cursor.hasNext()) {
                    DBObject temp = cursor.next();
                    coll2.insert(temp);
                    coll.remove(temp);
                } else {
                    ret = 1;
                }
            } finally {
                cursor.close();
            }
        } catch (UnknownHostException ex) {
            Logger.getLogger(gMIRC_handler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ret;
    }

    public String GetMessage(String username) {
        String ret = "";
        try {
            MongoClient mongoClient = new MongoClient();
            DB db = mongoClient.getDB("mirc");
            DBCollection coll = db.getCollection("inbox");
            BasicDBObject query = new BasicDBObject("target", username);
            JSONObject obj = new JSONObject();
            JSONArray arr = new JSONArray();
            DBCursor cursor = coll.find(query);

            try {
                while (cursor.hasNext()) {
                    BasicDBObject temp = (BasicDBObject) cursor.next();
                    JSONObject sav = new JSONObject();
                    sav.put("target", temp.getString("target"));
                    sav.put("username", temp.getString("username"));
                    sav.put("channel", temp.getString("channel"));
                    sav.put("message", temp.getString("message"));
                    sav.put("timestamp", temp.getLong("timestamp"));
                    arr.add(sav);
                    coll.remove(temp);
                }
                obj.put("msg", arr);
                ret = obj.toJSONString();
            } finally {
                cursor.close();
            }
        } catch (UnknownHostException ex) {
            Logger.getLogger(gMIRC_handler.class.getName()).log(Level.SEVERE, null, ex);
        }
        UpdateLastActive(username);
        return ret;
    }

    private int PutMessage(String username, String channelname, String msg) {
        int ret = 0;
        try {
            MongoClient mongoClient = new MongoClient();
            DB db = mongoClient.getDB("mirc");
            DBCollection coll = db.getCollection("inbox");
            DBCollection coll2 = db.getCollection("channelCollection");
            BasicDBObject query2 = new BasicDBObject("channel", channelname);
            BasicDBObject query = new BasicDBObject("channel", channelname).append("username", username);
            DBCursor cursor = coll2.find(query);
            try {
                if (cursor.hasNext()) {
                    DBCursor cursor2 = coll2.find(query2);
                    System.out.println("Got message from " + username);
                    try {
                        java.util.Date date = new java.util.Date();
                        while (cursor2.hasNext()) {
                            ret = 1;
                            BasicDBObject temp = (BasicDBObject) cursor2.next();
                            String target = temp.get("username").toString();
                            BasicDBObject put = new BasicDBObject("target", target).append("username", username)
                                    .append("channel", channelname).append("message", msg)
                                    .append("timestamp", date.getTime());
                            coll.insert(put);
                            ret = 0;
                        }
                    } finally {
                        cursor2.close();
                    }
                } else {
                    ret = 2;
                    System.out.println(username + " not registered to Channel : " + channelname);
                }
            } finally {
                cursor.close();
            }

        } catch (UnknownHostException ex) {
            ret = 1;
            Logger.getLogger(gMIRC_handler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ret;
    }

    private int PutMessageWild(String username, String msg) {
        int ret = 1;

        try {
            MongoClient mongoClient = new MongoClient();
            DB db = mongoClient.getDB("mirc");
            DBCollection coll2 = db.getCollection("channelCollection");
            BasicDBObject query = new BasicDBObject("username", username);
            System.out.println("Wild message appear from " + username + " !");
            DBCursor cursor = coll2.find(query);
            try {
                while (cursor.hasNext()) {
                    ret = 1;
                    BasicDBObject temp = (BasicDBObject) cursor.next();
                    String channelname = temp.getString("channel");
                    ret = ret & PutMessage(username, channelname, msg);
                }
            } finally {
                cursor.close();
            }
        } catch (UnknownHostException ex) {
            Logger.getLogger(gMIRC_handler.class.getName()).log(Level.SEVERE, null, ex);
        }

        return ret;
    }

}