diff --git a/src/ru/croc/jws/messenger/DimaZetBot/DimaZetBot.java b/src/ru/croc/jws/messenger/DimaZetBot/DimaZetBot.java new file mode 100644 index 0000000..bfc235c --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/DimaZetBot.java @@ -0,0 +1,62 @@ +package ru.croc.jws.messenger.DimaZetBot; + +import ru.croc.jws.messenger.DimaZetBot.JSON.JSON; +import ru.croc.jws.messenger.DimaZetBot.JSON.JSONParser; +import ru.croc.jws.messenger.DimaZetBot.Network.Requests.Request; +import ru.croc.jws.messenger.DimaZetBot.Network.Requests.RequestBuilder; +import ru.croc.jws.messenger.common.Message; +import ru.croc.jws.messenger.common.User; +import ru.croc.jws.messenger.server.Bot; +import ru.croc.jws.messenger.server.MessageRepository; + +import java.util.Arrays; + +public class DimaZetBot implements Bot { + + private final User bot = new User("DimaZet"); + + @Override + public User getUser() { + return bot; + } + + @Override + public void onMessage(Message message, MessageRepository messageRepository) { + String text = message.getText(); + String[] command = text.substring(text.indexOf(' ')+1).split(" "); + + System.out.println(Arrays.asList(command)); + String response = "[empty]"; + + RequestBuilder requestBuilder = new RequestBuilder(); + Request request; + try { + request = requestBuilder.build(command); + System.out.println(Arrays.asList(request.getType(), request.getMethod(), request.getRequest())); + request.execute(); + System.out.println(Arrays.asList(request.getResult())); + } catch (Throwable e) { + onWrongCommand(e, message, messageRepository); + return; + } + + JSONParser parser = new JSONParser(); + JSON json = request.getResult(); + System.out.println(Arrays.asList(json.toString())); + if (json != null){ + response = parser.parse(json, request.getMethod()); + System.out.println(Arrays.asList(response)); + } + + Message answer = new Message(bot, response); + messageRepository.addMessage(answer); + } + + private void onWrongCommand(Throwable e, Message message, MessageRepository messageRepository) { + Message normal = new Message(bot,e.getMessage()); + Message fake = new Message(message.getUser(), "я дурачок и не умею пользоваться ботом("); + messageRepository.addMessage(normal); + messageRepository.addMessage(fake); + } + +} diff --git a/src/ru/croc/jws/messenger/DimaZetBot/JSON/JSON.java b/src/ru/croc/jws/messenger/DimaZetBot/JSON/JSON.java new file mode 100644 index 0000000..f5d5311 --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/JSON/JSON.java @@ -0,0 +1,14 @@ +package ru.croc.jws.messenger.DimaZetBot.JSON; + +public class JSON { + private String json; + + public JSON(String json) { + this.json = json; + } + + @Override + public String toString() { + return json; + } +} \ No newline at end of file diff --git a/src/ru/croc/jws/messenger/DimaZetBot/JSON/JSONParser.java b/src/ru/croc/jws/messenger/DimaZetBot/JSON/JSONParser.java new file mode 100644 index 0000000..70d5bf1 --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/JSON/JSONParser.java @@ -0,0 +1,82 @@ +package ru.croc.jws.messenger.DimaZetBot.JSON; + +import ru.croc.jws.messenger.DimaZetBot.Network.Exeptions.WrongCommandArgs; +import ru.croc.jws.messenger.DimaZetBot.Network.Requests.RequestBuilder; +import ru.croc.jws.messenger.DimaZetBot.Network.Requests.Request; +import ru.croc.jws.messenger.DimaZetBot.Network.Exeptions.WrongCommandMethod; + +import java.io.IOException; +import java.util.Date; + +public class JSONParser { + + public String parse(JSON json, String type){ + String responce; + switch (type) { + case "wall.get": + responce = parseWallPost(json.toString()); + break; + case "users.get": + responce = parseUsersInfo(json.toString()); + break; + case "newsfeed.search": + responce = parseSearchedPost(json.toString()); + break; + default: + responce = "JSON parse Error"; + break; + } + return clear(responce); + } + + private String clear(String responce) { + return responce + .replaceAll("\\\\n", " ") + .replaceAll("\\\\/", "/") + .replaceAll("\\\\\"", "\"") + .replaceAll("\\\\\'", "\'"); + } + + private String parseSearchedPost(String string) { + String from_id = getStringParam("from_id",string); + + try { + Request getAuthor = new RequestBuilder().build("пользователь", from_id); + getAuthor.execute(); + JSON author = getAuthor.getResult(); + String userName = parseUsersInfo(author.toString()); + String date = new Date(getIntParam("date", string) * 1000L).toString(); + String text = parseWallPost(string); + return "[" + userName + " " + date + "] " + text; + } catch (WrongCommandMethod | WrongCommandArgs | IOException e) { + return e.getMessage(); + } + } + + private String parseUsersInfo(String string) { + return getStringParam("first_name", string) + " " + getStringParam("last_name", string); + } + + private String parseWallPost(String string) { + String text = getStringParam("text", string); + return text.isEmpty()?"[blank]":text; + } + + private String getStringParam(String param, String json) { + String substr; + param = "\"" + param + "\":"; + int from = json.indexOf(param) + param.length() + 1; + int to = json.indexOf("\",",from); + substr = json.substring(from,to); + return substr; + } + + private int getIntParam(String param, String json) { + String substr; + param = "\"" + param + "\":"; + int from = json.indexOf(param) + param.length(); + int to = json.indexOf(",",from); + substr = json.substring(from,to); + return Integer.valueOf(substr); + } +} \ No newline at end of file diff --git a/src/ru/croc/jws/messenger/DimaZetBot/Network/Exeptions/WrongArgsBuilderExeption.java b/src/ru/croc/jws/messenger/DimaZetBot/Network/Exeptions/WrongArgsBuilderExeption.java new file mode 100644 index 0000000..4b36b94 --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/Network/Exeptions/WrongArgsBuilderExeption.java @@ -0,0 +1,7 @@ +package ru.croc.jws.messenger.DimaZetBot.Network.Exeptions; + +public class WrongArgsBuilderExeption extends Exception { + public WrongArgsBuilderExeption(String message) { + super(message); + } +} diff --git a/src/ru/croc/jws/messenger/DimaZetBot/Network/Exeptions/WrongCommandArgs.java b/src/ru/croc/jws/messenger/DimaZetBot/Network/Exeptions/WrongCommandArgs.java new file mode 100644 index 0000000..818ed31 --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/Network/Exeptions/WrongCommandArgs.java @@ -0,0 +1,14 @@ +package ru.croc.jws.messenger.DimaZetBot.Network.Exeptions; + +public class WrongCommandArgs extends Exception{ + private String why; + + public WrongCommandArgs(String why) { + this.why = why; + } + + @Override + public String getMessage() { + return why; + } +} diff --git a/src/ru/croc/jws/messenger/DimaZetBot/Network/Exeptions/WrongCommandMethod.java b/src/ru/croc/jws/messenger/DimaZetBot/Network/Exeptions/WrongCommandMethod.java new file mode 100644 index 0000000..4783f8f --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/Network/Exeptions/WrongCommandMethod.java @@ -0,0 +1,14 @@ +package ru.croc.jws.messenger.DimaZetBot.Network.Exeptions; + +public class WrongCommandMethod extends Exception { + private String method; + + public WrongCommandMethod(String method) { + this.method = method; + } + + @Override + public String getMessage() { + return "не знаю команды \"" + method + "\""; + } +} diff --git a/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/GetRequest.java b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/GetRequest.java new file mode 100644 index 0000000..6c7d4af --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/GetRequest.java @@ -0,0 +1,48 @@ +package ru.croc.jws.messenger.DimaZetBot.Network.Requests.GETRequests; + +import ru.croc.jws.messenger.DimaZetBot.JSON.JSON; +import ru.croc.jws.messenger.DimaZetBot.Network.Requests.Request; + +import javax.net.ssl.HttpsURLConnection; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.Arrays; + +public abstract class GetRequest extends Request { + @Override + public Request build(String... args) { + type = "GET"; + StringBuilder r = new StringBuilder(API).append(setMethodAndParams(args)).append("&access_token=").append(ACCESS_TOKEN).append("&v=").append(V); + request = r.toString(); + System.out.println(Arrays.asList(request)); + return this; + } + + @Override + public void execute() throws IOException { + HttpsURLConnection connection = (HttpsURLConnection) new URL(request).openConnection(); + connection.setRequestMethod(type); + connection.connect(); + + //int resp = connection.getResponseCode(); + //if (resp == 200) { + BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); + + String line; + StringBuilder sb = new StringBuilder(); + while ((line = br.readLine()) != null) { + sb.append(line); + } + br.close(); + + result = new JSON(sb.toString()); + //} + } + + @Override + public JSON getResult() { + return result; + } +} diff --git a/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/NewsfeedSearchRequest.java b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/NewsfeedSearchRequest.java new file mode 100644 index 0000000..a5a93a6 --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/NewsfeedSearchRequest.java @@ -0,0 +1,15 @@ +package ru.croc.jws.messenger.DimaZetBot.Network.Requests.GETRequests; + +public class NewsfeedSearchRequest extends GetRequest { + + @Override + protected StringBuilder setMethodAndParams(String... args) { + method = "newsfeed.search"; + StringBuilder r = new StringBuilder(method).append("?q="); + for (int i = 1; i < args.length-1; i++) { + r.append(args[i]).append("_"); + } + r.append(args[args.length-1]); + return r; + } +} \ No newline at end of file diff --git a/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/UsersGetRequest.java b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/UsersGetRequest.java new file mode 100644 index 0000000..dd59040 --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/UsersGetRequest.java @@ -0,0 +1,11 @@ +package ru.croc.jws.messenger.DimaZetBot.Network.Requests.GETRequests; + +public class UsersGetRequest extends GetRequest { + @Override + protected StringBuilder setMethodAndParams(String... args) { + method = "users.get"; + String param = "user_ids"; + StringBuilder r = new StringBuilder(method).append("?").append(param).append("=").append(args[1]); + return r; + } +} \ No newline at end of file diff --git a/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/WallGetRequest.java b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/WallGetRequest.java new file mode 100644 index 0000000..8a966c0 --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/GETRequests/WallGetRequest.java @@ -0,0 +1,12 @@ +package ru.croc.jws.messenger.DimaZetBot.Network.Requests.GETRequests; + +public class WallGetRequest extends GetRequest { + + @Override + protected StringBuilder setMethodAndParams(String... args) { + method = "wall.get"; + String param = "domain"; + StringBuilder r = new StringBuilder(method).append("?").append(param).append("=").append(args[1]); + return r; + } +} \ No newline at end of file diff --git a/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/Request.java b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/Request.java new file mode 100644 index 0000000..406417c --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/Request.java @@ -0,0 +1,25 @@ +package ru.croc.jws.messenger.DimaZetBot.Network.Requests; + +import ru.croc.jws.messenger.DimaZetBot.JSON.JSON; + +import java.io.IOException; + +public abstract class Request { + protected static final String API = "https://api.vk.com/method/"; + protected static final String ACCESS_TOKEN = "60b897cc60b897cc60b897cc3e60d1fb4c660b860b897cc3c2b5a4b6c136e2fae866644"; + protected static final String V = "5.95"; + protected String type; + protected String method; + protected String request; + protected JSON result; + + public abstract Request build(String... args); + public abstract void execute() throws IOException; + + public String getType() {return type;} + public String getMethod() {return method;} + public String getRequest() {return request;} + public abstract JSON getResult(); + protected abstract StringBuilder setMethodAndParams(String... args); +} + diff --git a/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/RequestBuilder.java b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/RequestBuilder.java new file mode 100644 index 0000000..d5af102 --- /dev/null +++ b/src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/RequestBuilder.java @@ -0,0 +1,33 @@ +package ru.croc.jws.messenger.DimaZetBot.Network.Requests; + +import ru.croc.jws.messenger.DimaZetBot.Network.Exeptions.WrongCommandArgs; +import ru.croc.jws.messenger.DimaZetBot.Network.Requests.GETRequests.UsersGetRequest; +import ru.croc.jws.messenger.DimaZetBot.Network.Requests.GETRequests.WallGetRequest; +import ru.croc.jws.messenger.DimaZetBot.Network.Requests.GETRequests.NewsfeedSearchRequest; +import ru.croc.jws.messenger.DimaZetBot.Network.Exeptions.WrongCommandMethod; + +import java.util.HashMap; + +public class RequestBuilder { + + + HashMap methods = new HashMap<>(); + private void initializeMethods() { + methods.put("группа", new WallGetRequest()); + methods.put("пользователь", new UsersGetRequest()); + methods.put("поиск", new NewsfeedSearchRequest()); + } + + public Request build(String... args) throws WrongCommandMethod, WrongCommandArgs { + String command = args[0]; + if (!methods.containsKey(command)) + throw new WrongCommandMethod(command); + if (args.length < 2) + throw new WrongCommandArgs("недостаточно понятно"); + return methods.get(command).build(args); + } + + public RequestBuilder() { + initializeMethods(); + } +} diff --git a/src/ru/croc/jws/messenger/server/Server.java b/src/ru/croc/jws/messenger/server/Server.java index 3e64329..4f2c837 100644 --- a/src/ru/croc/jws/messenger/server/Server.java +++ b/src/ru/croc/jws/messenger/server/Server.java @@ -15,6 +15,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import ru.croc.jws.messenger.DimaZetBot.DimaZetBot; import ru.croc.jws.messenger.common.Message; import ru.croc.jws.messenger.common.User; @@ -39,7 +40,9 @@ public Server(int port) { private void registerBots() { Bot daisyBot = new DaisyBot(); + Bot dimazet = new DimaZetBot(); bots.put(daisyBot.getUser(), daisyBot); + bots.put(dimazet.getUser(), dimazet); } public void start() throws IOException {