Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions src/ru/croc/jws/messenger/DimaZetBot/DimaZetBot.java
Original file line number Diff line number Diff line change
@@ -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);
}

}
14 changes: 14 additions & 0 deletions src/ru/croc/jws/messenger/DimaZetBot/JSON/JSON.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
82 changes: 82 additions & 0 deletions src/ru/croc/jws/messenger/DimaZetBot/JSON/JSONParser.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.croc.jws.messenger.DimaZetBot.Network.Exeptions;

public class WrongArgsBuilderExeption extends Exception {
public WrongArgsBuilderExeption(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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 + "\"";
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
25 changes: 25 additions & 0 deletions src/ru/croc/jws/messenger/DimaZetBot/Network/Requests/Request.java
Original file line number Diff line number Diff line change
@@ -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);
}

Original file line number Diff line number Diff line change
@@ -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<String, Request> 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();
}
}
3 changes: 3 additions & 0 deletions src/ru/croc/jws/messenger/server/Server.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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 {
Expand Down