phantombot-plugins/twitch/chatguessr.js

185 lines
6.8 KiB
JavaScript
Raw Normal View History

2022-02-09 02:52:17 +01:00
(function() {
2022-02-09 02:51:18 +01:00
2022-02-09 03:12:09 +01:00
2022-02-09 02:51:18 +01:00
2022-02-09 03:12:49 +01:00
function fetchSeed(id) {
2022-02-09 03:12:09 +01:00
var HttpRequest = Packages.com.gmt2001.HttpRequest,
2022-02-09 03:16:02 +01:00
HashMap = Packages.java.util.HashMap,
2022-02-09 03:17:32 +01:00
JSONObject = Packages.org.json.JSONObject,
2022-02-09 03:16:02 +01:00
header = new HashMap(0),
json = new JSONObject('{}');
2022-02-09 03:19:16 +01:00
var request = HttpRequest.getData(HttpRequest.RequestType.GET,'https://www.geoguessr.com/api/v3/games/'+id,json.toString(),header);
2022-02-09 03:10:51 +01:00
if (request.success) {
var data = new JSONObject(request.content)
return data;
}
2022-02-09 02:51:18 +01:00
};
2022-02-09 03:12:49 +01:00
function getCountryBDC(location) {
2022-02-09 03:12:09 +01:00
var HttpRequest = Packages.com.gmt2001.HttpRequest,
2022-02-09 03:16:02 +01:00
HashMap = Packages.java.util.HashMap,
2022-02-09 03:17:32 +01:00
JSONObject = Packages.org.json.JSONObject,
2022-02-09 03:16:02 +01:00
header = new HashMap(0),
json = new JSONObject('{}');
2022-02-09 03:12:09 +01:00
const BDC_KEY = "067c718d2bbd4a2ba8d0645e1633cac2";
2022-02-09 03:19:16 +01:00
var request = HttpRequest.getData(HttpRequest.RequestType.GET,'https://api.bigdatacloud.net/data/reverse-geocode?latitude='+location.lat+'&longitude='+location.lng+'&key='+BDC_KEY,json.toString(),header);
2022-02-09 03:10:51 +01:00
if (request.success) {
var data = new JSONObject(request.content)
return data.countryCode;
}
2022-02-09 02:51:18 +01:00
};
2022-02-09 03:21:37 +01:00
function moveFrom(coords, angle, distance) {
2022-02-09 03:23:25 +01:00
var radianAngle = (angle * Math.PI) / 180;
var x = 0 + distance * Math.cos(radianAngle);
var y = 0 + distance * Math.sin(radianAngle);
var newLat = coords.lat + y * M;
var newLng = coords.lng + (x * M) / Math.cos(coords.lat * (Math.PI / 180));
2022-02-09 03:21:37 +01:00
return { lat: newLat, lng: newLng };
}
2022-02-09 02:55:43 +01:00
function getSurroundings (location) {
2022-02-09 02:51:18 +01:00
const meters = 100;
const R_EARTH = 6378.137;
const M = 1 / (((2 * Math.PI) / 360) * R_EARTH) / 1000;
2022-02-09 03:23:25 +01:00
var coordinates = [location];
for (var angle = 0; angle < 360; angle += 45) {
2022-02-09 02:51:18 +01:00
coordinates.push(moveFrom({ lat: location.lat, lng: location.lng }, angle, meters));
}
return coordinates;
};
2022-02-09 02:55:43 +01:00
function isCoordinates (coordinates) {
2022-02-09 02:51:18 +01:00
const regex = /^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$/g;
return regex.test(coordinates);
};
2022-02-09 02:55:43 +01:00
function calculateScale(bounds){
return haversineDistance({ lat: bounds.min.lat, lng: bounds.min.lng }, { lat: bounds.max.lat, lng: bounds.max.lng }) / 7.458421;
2022-02-09 02:51:18 +01:00
}
2022-02-09 02:55:43 +01:00
function haversineDistance(mk1, mk2){
2022-02-09 02:51:18 +01:00
const R = 6371.071;
const rlat1 = mk1.lat * (Math.PI / 180);
const rlat2 = mk2.lat * (Math.PI / 180);
const difflat = rlat2 - rlat1;
const difflon = (mk2.lng - mk1.lng) * (Math.PI / 180);
const km =
2 *
R *
Math.asin(Math.sqrt(Math.sin(difflat / 2) * Math.sin(difflat / 2) + Math.cos(rlat1) * Math.cos(rlat2) * Math.sin(difflon / 2) * Math.sin(difflon / 2)));
return km;
};
2022-02-09 02:55:43 +01:00
function calculateScore(distance, scale){
2022-02-09 02:51:18 +01:00
return Math.round(5000 * Math.pow(0.99866017, (distance * 1000) / scale));
}
2022-02-09 02:55:43 +01:00
function normalize(val){
2022-02-09 02:51:18 +01:00
return val.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
2022-02-09 02:55:43 +01:00
function isMatch(input, key){
2022-02-09 02:51:18 +01:00
return input.length >= 3 && key.includes(input) && input.length <= key.length;
}
2022-02-09 02:55:43 +01:00
function findCountry(input){
2022-02-09 02:51:18 +01:00
const normalized = GameHelper.normalize(input);
return countryCodesNames.find((country) => country.code === normalized || GameHelper.isMatch(normalized, country.names.toLowerCase()));
};
2022-02-09 02:52:17 +01:00
2022-02-09 02:51:18 +01:00
var isOpen = $.getSetIniDbBoolean('chatguessr', 'isOpen', false),
2022-02-09 02:28:05 +01:00
seed = {},
guesses = {
'1':[
{user:'Alpha',location:'0,0',distance:5,score:2,streak:0},
{user:'Beta',location:'5,0',distance:100,score:3,streak:0},
{user:'Charlie',location:'6,6',distance:1000,score:0,streak:0},
{user:'Delta',location:'42,6',distance:1,score:5,streak:1}
],
'2':[
],
};
function dbSetSeed(id) {
$.inidb.SetBoolean("chatguessr", "isOpen", "", open);
isOpen = open;
}
2022-02-07 17:19:38 +01:00
2022-02-09 02:28:05 +01:00
function dbSetOpen(open) {
2022-02-07 17:19:38 +01:00
$.inidb.SetBoolean("chatguessr", "isOpen", "", open);
isOpen = open;
sendData('status',open);
}
2022-02-09 02:28:05 +01:00
function dbClearGuesses() {
2022-02-07 17:19:38 +01:00
guesses = {};
$.inidb.SetString("chatguessr", "guesses", JSON.stringify(guesses));
sendData('guesses',guesses);
}
2022-02-09 02:28:05 +01:00
function dbAddGuess(user,position) {
2022-02-07 17:19:38 +01:00
if(guesses[user] && guesses[user].length > 0){
2022-02-08 15:59:11 +01:00
}else if(isCoordinates(position)){
2022-02-07 17:19:38 +01:00
guesses[user] = position;
$.inidb.SetString("chatguessr", "guesses", JSON.stringify(guesses));
2022-02-09 02:28:05 +01:00
sendData('guesses',JSON.stringify(guesses));
2022-02-07 17:19:38 +01:00
}
}
function sendData(tpe, data) {
$.panelsocketserver.sendJSONToAll(JSON.stringify({
'eventFamily': 'chatguessr',
'eventType': tpe,
'data': data
}));
}
2022-02-08 15:59:11 +01:00
function isCoordinates(coordinates) {
const regex = /^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$/g;
return regex.test(coordinates);
};
2022-02-07 17:19:38 +01:00
$.bind('command', function(event) {
const sender = "" + event.getSender().toLowerCase(),
command = event.getCommand(),
args = event.getArgs(),
action = args[0];
if (command.equalsIgnoreCase('g')) {
if(isOpen) DBAddG(sender,args);
}else if (command.equalsIgnoreCase('cg')) {
2022-02-09 02:28:05 +01:00
//send url
//$.say($.whisperPrefix(sender) + $.lang.get('chatguessr.help', ' Use "!cg [open | close | ...]" to open/close the feature.'));
}else if(command.equalsIgnoreCase('cga')){
if(action.equalsIgnoreCase('open')){
isOpen = true;
$.getSetIniDbBoolean('cgstatus', 'isOpen', true);
}else if(action.equalsIgnoreCase('close')){
isOpen = false;
$.getSetIniDbBoolean('cgstatus', 'isOpen', false)
}else if(action.equalsIgnoreCase('start')){
seed = GameHelper.fetchSeed(args[1]);
}else if(action.equalsIgnoreCase('end')){
isOpen = false;
$.getSetIniDbBoolean('cgstatus', 'isOpen', false)
}else if(action.equalsIgnoreCase('refresh')){
2022-02-09 03:24:47 +01:00
var newseed = GameHelper.fetchSeed(args[1]);
2022-02-09 02:28:05 +01:00
}else if(action.equalsIgnoreCase('gg')){
sendData('guesses',JSON.stringify(guesses));
2022-02-07 17:19:38 +01:00
}
}
});
$.bind('initReady', function() {
2022-02-09 02:28:05 +01:00
$.registerChatCommand('./custom/custom/chatguessr.js', 'cg',7);
2022-02-07 17:19:38 +01:00
$.registerChatCommand('./custom/custom/chatguessr.js', 'g',7);
2022-02-09 02:28:05 +01:00
$.registerChatCommand('./custom/custom/chatguessr.js', 'cga');
$.registerChatSubcommand('cga', 'open', 2);
$.registerChatSubcommand('cga', 'close', 2);
$.registerChatSubcommand('cga', 'start', 2);
$.registerChatSubcommand('cga', 'end', 2);
$.registerChatSubcommand('cga', 'refresh', 2);
2022-02-09 03:27:47 +01:00
$.registerChatSubcommand('cga', 'gg', 2);
2022-02-07 17:19:38 +01:00
});
2022-02-09 02:28:05 +01:00
})();