Files
tlw-database-tool/src/main/java/de/jeyp91/gists/GistProvider.java
T
2020-10-18 20:48:23 +02:00

250 lines
7.7 KiB
Java

package de.jeyp91.gists;
import com.google.api.client.util.DateTime;
import com.google.common.io.Resources;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPatch;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Set;
public class GistProvider {
private static GistProvider prov = null;
private JSONArray gistList;
private String username;
private String password;
private GistProvider() {
readConfig();
this.gistList = listAllGists();
}
private void readConfig() {
JSONParser jsonParser = new JSONParser();
URL url = Resources.getResource("Gist_Config.json");
JSONObject gistConfig = null;
try {
String jsonConfig = Resources.toString(url, StandardCharsets.UTF_8);
//Read JSON file
gistConfig = (JSONObject) jsonParser.parse(jsonConfig);
} catch (IOException | ParseException e) {
e.printStackTrace();
}
this.username = gistConfig.get("username").toString();
this.password = gistConfig.get("password").toString();
}
public static GistProvider getInstance() {
if (prov == null) {
prov = new GistProvider();
}
return prov;
}
public JSONArray listAllGists() {
String gistsRaw = getRawData("https://api.github.com/gists");
return stringToJSONArray(gistsRaw);
}
public DateTime getGistUpdatedTimestamp(String gistDescription) {
DateTime updated = null;
for (Object o : this.gistList) {
JSONObject gist = (JSONObject) o;
String desc = gist.get("description").toString();
if (gistDescription.equals(desc)) {
updated = new DateTime(gist.get("updated_at").toString());
}
}
return updated;
}
public String getGistID(String gistDescription) {
String id = null;
for (Object o : this.gistList) {
JSONObject gist = (JSONObject) o;
String desc = gist.get("description").toString();
if (gistDescription.equals(desc)) {
id = gist.get("id").toString();
}
}
return id;
}
public String updateGist(String id, String file, String content) throws UnsupportedEncodingException {
String requestUrl = "https://api.github.com/gists/" + id;
String auth = this.username + ":" + this.password;
byte[] encodedAuth = Base64.encodeBase64(
auth.getBytes(StandardCharsets.ISO_8859_1));
String authHeader = "Basic " + new String(encodedAuth);
HttpClient client = HttpClientBuilder
.create()
.build();
HttpPatch request = new HttpPatch(requestUrl);
request.setHeader(HttpHeaders.AUTHORIZATION, authHeader);
request.setHeader(HttpHeaders.ACCEPT, "application/vnd.github.v3+json");
JSONObject contentObject = new JSONObject();
contentObject.put("content", content);
JSONObject fileObject = new JSONObject();
fileObject.put(file, contentObject);
JSONObject filesObject = new JSONObject();
filesObject.put("files", fileObject);
String bodyString = filesObject.toString();
StringEntity body = new StringEntity(filesObject.toString());
body.setContentType("application/json");
body.setContentEncoding("UTF-8");
request.setEntity(body);
HttpResponse response = null;
try {
response = client.execute(request);
} catch (IOException e) {
/* TODO */
e.printStackTrace();
}
BufferedReader rd = null;
try {
rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent(), StandardCharsets.UTF_8)
);
} catch (IOException e) {
/* TODO */
e.printStackTrace();
}
StringBuilder result = new StringBuilder();
String line = "";
while (true) {
try {
line = rd.readLine();
} catch (IOException e) {
/* TODO */
e.printStackTrace();
}
// Stop reading if last line was found.
if (line == null) break;
result.append(line);
}
return result.toString();
}
public JSONArray getTeamIdMatcher() {
String id = getGistID("Team_ID_Matcher");
return stringToJSONArray(getFileFromGist(id, "Team_ID_Matcher.json"));
}
public String getFileFromGist(String id, String filename) {
String fileurl = null;
for (Object o : this.gistList) {
JSONObject gist = (JSONObject) o;
JSONObject files = (JSONObject)gist.get("files");
Set<String> filenames = files.keySet();
if(filenames.contains(filename)) {
fileurl = ((JSONObject)files.get(filename)).get("raw_url").toString();
}
}
String content = null;
if(fileurl != null) {
content = getRawData(fileurl);
}
return content;
}
private String getRawData(String requestUrl) {
String auth = this.username + ":" + this.password;
byte[] encodedAuth = Base64.encodeBase64(
auth.getBytes(StandardCharsets.ISO_8859_1));
String authHeader = "Basic " + new String(encodedAuth);
HttpClient client = HttpClientBuilder
.create()
.build();
HttpGet request = new HttpGet(requestUrl);
request.setHeader(HttpHeaders.AUTHORIZATION, authHeader);
HttpResponse response = null;
try {
response = client.execute(request);
} catch (IOException e) {
/* TODO */
e.printStackTrace();
}
BufferedReader rd = null;
try {
rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent(), "UTF-8")
);
} catch (IOException e) {
/* TODO */
e.printStackTrace();
}
StringBuilder result = new StringBuilder();
String line = "";
while (true) {
try {
line = rd.readLine();
} catch (IOException e) {
/* TODO */
e.printStackTrace();
}
// Stop reading if last line was found.
if (line == null) break;
result.append(line);
}
return result.toString();
}
private JSONArray stringToJSONArray(String rawData) {
JSONParser parser = new JSONParser();
JSONArray data = null;
try {
data = (JSONArray) parser.parse(rawData);
} catch (ParseException e) {
/* TODO */
e.printStackTrace();
}
return data;
}
public String getTippligaConfig(int season, String filename) {
String id = getGistID("Tippliga_Config_" + season);
return getFileFromGist(id, filename);
}
public String getTippligaBaseConfig(String filename) {
String id = getGistID("Tippliga_Config_Base");
return getFileFromGist(id, filename);
}
}