var CA_API_VERSION = '1.2.5';
class CA_API {
constructor(conf = {}){
this.current_user = null;
this.debug = false;
this.isAdsense = false;
this.isAdReady = false;
this.ima_adtag = ''; // deprecated
this.imasdk; // deprecated
this.last_shown;
if(conf.debug){
this.debug = true;
}
this.send('get_ad_config').then((result)=>{
if(result){
let self = this;
let data = JSON.parse(result);
if(data){
if(data.status === 'active'){
if(data.h5_client_id && data.h5_client_id.length > 8){
this.isAdsense = true;
this.log('Ad configured');
// Create the external script element
let externalScript = document.createElement('script');
externalScript.async = true;
externalScript.src = "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client="+data.h5_client_id;
externalScript.crossOrigin = "anonymous";
externalScript.onload = function() {
self.isAdReady = true;
self.log('Ad ready');
};
document.head.appendChild(externalScript);
// Create the inline script element
let inlineScript = document.createElement('script');
inlineScript.textContent = `
window.adsbygoogle = window.adsbygoogle || [];
const adBreak = adConfig = function(o) { adsbygoogle.push(o); }
`;
document.head.appendChild(inlineScript);
} else {
console.log('ERR 717');
}
}
}
}
});
}
submit_score(val){
if(val){
val = Number(val);
val = btoa((val/1.33));
let wait = new Promise((res) => {
this.send('submit', val).then((result)=>{
if(result){
this.log('SUBMIT SCORE');
res(result);
} else {
this.log('FAILED SUBMIT SCORE');
res(false);
}
});
});
return wait;
}
}
send(action, val = 0, conf = null){
let game_id = this.game_id;
let cur_url = window.location.href;
let ref;
if(cur_url[cur_url.length-1] === '/'){
ref = cur_url.substring(
cur_url.indexOf("/games/") + 7,
cur_url.length-1
);
} else if(cur_url.substr(cur_url.length-5, cur_url.length) === '.html') {
ref = cur_url.substring(
cur_url.indexOf("/games/") + 7,
cur_url.lastIndexOf("/index.html")
);
}
let wait = new Promise((res) => {
let params = 'action='+action+'&value='+val+'&ref='+ref;
if(conf){
params += '&conf='+conf;
}
let xhr = new XMLHttpRequest();
xhr.open('POST', '/includes/api.php', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
if (xhr.status === 200) {
if(xhr.responseText != 'ok'){
try {
JSON.parse(xhr.responseText);
} catch {
console.warn('CA Error/Fail');
console.log(xhr.responseText);
}
}
res(xhr.responseText);
}
else {
res(false);
}
}.bind(this);
xhr.onerror = function() {
res(false);
}
xhr.send(params);
});
return wait;
}
get_current_user(){
let wait = new Promise((res) => {
this.send('get_current_user').then((result)=>{
if(result){
this.current_user = JSON.parse(result);
res(result);
} else {
res(false);
}
});
});
return wait;
}
get_user_score(){
let wait = new Promise((res) => {
this.send('get_user_score').then((val)=>{
if(!isNaN(val)){
res(Number(val));
}
});
});
return wait;
}
get_score_rank(){
let wait = new Promise((res) => {
this.send('get_score_rank').then((val)=>{
if(!isNaN(val)){
res(Number(val));
}
});
});
return wait;
}
get_scoreboard(conf){
let wait = new Promise((res) => {
this.send('get_scoreboard', 0, JSON.stringify(conf)).then((val)=>{
if(val){
res(val);
} else {
this.log('FAILED GET LEADERBOARD');
res(false);
}
});
});
return wait;
}
log(msg = ''){
if(this.debug){
console.log('CA: '+msg);
}
}
prepare_ad_element(){
let div = document.getElementById('CA_AD');
if(!div){
let link = document.createElement('link');
link.rel = 'stylesheet';
link.href = '/admin/style/api.css';
document.head.appendChild(link);
let elem = document.createElement('div');
elem.id = 'CA_AD';
document.body.appendChild(elem);
}
let html = '
';
html += '
';
html += '
';
html += '
';
html += '';
html += '
';
html += '
';
html += '
';
html += '
';
document.getElementById("CA_AD").innerHTML = html;
}
show_ad_element(val){
if(val.type == 'banner'){
let div = document.getElementById('ad-content');
let html = '';
//html += '';
html += '';
html += '
';
if(!val.delay){
html += '';
}
html += '
';
html += '';
div.innerHTML = html;
let img_banner = document.createElement("img");
img_banner.src = val.value;
img_banner.id = 'banner-content';
img_banner.classList.add('banner-content');
img_banner.onload = function() {
document.getElementById('banner-link').append(this);
make_banner_fit();
}
if(val.delay){
document.getElementById('ad-delay').innerHTML = 'Wait '+(val.delay)+' seconds';
let count = 0;
let interval = setInterval(()=>{
count++;
document.getElementById('ad-delay').innerHTML = 'Wait '+(val.delay-count)+' seconds';
if(count >= val.delay){
document.getElementById('ad-delay').innerHTML = '';
document.getElementById('ca_b_close').innerHTML = '';
clearInterval(interval);
}
}, 1000);
}
function make_banner_fit(){
let body_width = document.body.clientWidth;
if(document.getElementById('banner-content').clientWidth > body_width){
document.getElementById('banner-content').style.width = body_width+"px";
}
}
} else if(val.type == 'ima'){
if(val.value != ''){
if(!this.isAdsense){
this.isAdsense = true;
// removed
} else {
show_ads(this);
}
} else {
this.log('IMA AD Tag is empty.');
this.on_ad_error();
this.remove_ad();
}
}
function show_ads(scope){
if(this.isAdsense){
//
} else {
if(document.getElementById('ca-ads')){
document.getElementById('ca-ads').style.display = 'block';
}
// if(!scope.imasdk){
// scope.imasdk = new Application;
// }
// scope.imasdk.showAds();
}
}
}
showAd(){
if(this.isAdsense && this.isAdReady){
if(this.last_shown){
let time_gap = Math.floor((Date.now() - this.last_shown) / 1000);
if(time_gap < 60){ // 1 minute
this.log('AD CANCELED, TOO FREQUENT');
return;
}
}
this.last_shown = Date.now();
let self = this;
adBreak({
type: '-',
name: '-',
beforeAd: () => { self.beforeAd(); }, // You may also want to mute the game's sound.
afterAd: () => { self.afterAd(); }, // resume the game flow.
});
}
}
show_ad(tag = null){
// Old method, deprecated
if(this.last_shown){
let time_gap = Math.floor((Date.now() - this.last_shown) / 1000);
if(time_gap < 120){
this.log('AD CANCELED, TOO FREQUENT');
return;
}
}
this.last_shown = Date.now();
this.log('TRIGGER SHOW AD');
this.paused();
this.on_ad_trigger();
this.prepare_ad_element();
let wait = new Promise((res) => {
this.send('load_ad', tag).then((val)=>{
this.on_ad_start();
if(val){
try {
this.log('AD TAG LOADED');
val = JSON.parse(val);
if(val.error){
this.log(val.error);
this.on_ad_error();
this.remove_ad();
res(false);
} else if(val.value == ''){
this.log('Ad/tag value is empty');
this.on_ad_error();
this.remove_ad();
res(false);
} else {
this.show_ad_element(val);
res(val);
}
} catch (err) {
console.log(err);
this.log('AD FAILED TO PARSE');
this.on_ad_error();
this.remove_ad();
res(false);
}
} else {
this.log('AD FAILED TO LOAD TAG');
this.on_ad_error();
this.remove_ad();
res(false);
}
});
});
return wait;
}
ad_clicked(name){
//Or banner clicked
this.send('ad_clicked', name);
}
close_ad(){
this.log('AD CLOSED BY PLAYER');
this.remove_ad();
this.on_ad_closed();
}
remove_ad(){
if(document.getElementById('CA_AD')){
document.getElementById('CA_AD').innerHTML = '';
}
if(document.getElementById('ca-ads')){
document.getElementById('ca-ads').style.display = 'none';
}
this.on_ad_end();
this.resume();
}
// Callbacks
beforeAd(){
// Set from game code
// Called before the Ad begin to shown
// Used to pause game, mute.etc
}
afterAd(){
// Set from game code
// Called after the Ad shown / closed
// Used to resume game, unmute.etc
}
paused(){
//
}
resume(){
//
}
on_ad_trigger(){
//
}
on_ad_start(){
//
}
on_ad_end(){
//
}
on_ad_closed(){
// Ad closed or skipped by Player
}
on_ad_finished(){
// Used for Adsense
}
on_ad_error(e){
//
}
}
console.log('CA API v'+CA_API_VERSION+' loaded!');
const ca_api = new CA_API;