MyDiceBot - v190610 with KryptoGamers is supported
Feature Update
- KryptoGamers is supported
Source Codes
- UI code
function init() {
console.log('hello KryptoGames Dice');
$$("bet_currency_selection").define("options", [
{id:1,value:"STEEM"},
{id:2,value:"SBD"},
]);
minBetAmount = 0.1;
$$("manual_bet_amount").setValue(minBetAmount);
$$("auto_bet_base_amount").setValue(minBetAmount);
$$("manual_bet_chance").setValue(49);
$$("auto_bet_base_chance").setValue(49);
$$("bet_currency_selection").refresh();
$$("manual_bet_high_button").hide();
$$("auto_bet_start_low_high").define("options", ["LOW"]);
$$("auto_bet_start_low_high").refresh();
}
function checkParams(p,ch){
//console.log(p,ch);
if(p < 0.00000001 || p > 1000000000*1000000000) {
return false
}
if(ch>94 || ch<1) {
return false
}
return true;
}
function initScriptBalance(currencyValue, cb){
getInfo(function(userinfo){
if(userinfo.info.success == 'true'){
try {
balance = userinfo.info.balance;
bets = userinfo.info.bets;
wins = userinfo.info.wins;
losses = userinfo.info.losses;
profit = userinfo.info.profit;
} catch(err){
console.error(err.message);
webix.message({type: 'error', text: err.message});
return false;
}
cb();
}
});
}
function getBalance(userinfo){
balance = userinfo.info.balance
return balance;
}
function getProfit(userinfo){
profit = userinfo.currentInfo.profit;
//console.log('actprofit:'+actProfit);
return profit;
}
function getCurrProfit(ret){
currentprofit = ret.betInfo.profit
//console.log('currprofit:'+currProfit);
return currentprofit;
}
function getCurrentBetId(ret){
let betId = ret.betInfo.id;
//console.log('currentBetId:'+betId);
return betId;
}
function getCurrentRoll(ret){
currentroll = ret.betInfo.roll_number;
//console.log('currentRoll:'+roll);
return currentroll;
}
function outError(ret){
let mess = ret.err;
return checkerr(mess);
}
function isError(ret){
if(typeof ret.err != "undefined")
return false;
else
return true;
}
function getWinStatus(ret){
return ret.betInfo.win;
}
function setDatatable(ret){
let chanceStr = ''+ ret.betInfo.condition + ' '+ ret.betInfo.target +'';
if(ret.betInfo.win){
chanceStr = ''+ ret.betInfo.condition + ' '+ ret.betInfo.target +'';
}
let profitStr = '' + ret.betInfo.profit+ '';
if(ret.betInfo.profit>0) {
profitStr = '' + ret.betInfo.profit + '';
}
$$('bet_datatable').add({
bet_datatable_id:ret.betInfo.id,
bet_datatable_amount:ret.betInfo.amount,
bet_datatable_low_high:ret.betInfo.condition,
bet_datatable_payout:ret.betInfo.payout,
bet_datatable_bet_chance:chanceStr,
bet_datatable_actual_chance:ret.betInfo.roll_number,
bet_datatable_profit:profitStr,
},0);
}
function setStats(userinfo, cv){
if(userinfo.info.success == 'true'){
$$('bet_total_stats').setValues({
bet_total_stats_balance:userinfo.info.balance,
bet_total_stats_win:userinfo.info.wins,
bet_total_stats_loss:userinfo.info.losses,
bet_total_stats_bet:userinfo.info.bets,
bet_total_stats_profit:userinfo.info.profit,
bet_total_stats_wagered:userinfo.info.wagered,
});
$$('bet_current_stats').setValues({
bet_current_stats_balance:userinfo.currentInfo.balance,
bet_current_stats_win:userinfo.currentInfo.wins,
bet_current_stats_loss:userinfo.currentInfo.losses,
bet_current_stats_bet:userinfo.currentInfo.bets,
bet_current_stats_profit:userinfo.currentInfo.profit,
bet_current_stats_wagered:userinfo.currentInfo.wagered,
});
}
}
* Backend Code
```javascript
'use strict';
import {BaseDice} from './base'
import FormData from 'form-data';
import {APIError} from '../errors/APIError';
import steem from 'steem';
import request from 'request';
import fetch from 'isomorphic-fetch';
export class KryptoGames extends BaseDice {
constructor(){
super();
this.url = 'https://kryptogames.io';
this.benefit = '?ref=mydicebot'
this.currencys = ["steem","sbd"];
steem.api.setOptions({url:'https://api.steemit.com'});
}
async login(userName, password, twoFactor ,apiKey, req) {
req.session.accessToken = apiKey;
req.session.username = userName;
return true;
}
async getUserInfo(req) {
let info = req.session.info;
if(typeof info != 'undefined'){
return true;
}
let userName = req.session.username;
let ret = await steem.api.getAccountsAsync([userName]);
let userinfo = {
'bets' : 0,
'wins' : 0,
'losses' : 0,
'profit' : 0,
'wagered' : 0,
'balance' : 0,
};
for(let k in ret){
let sbd = ret[k]['sbd_balance'].split(' ');
let steem_balance = ret[k]['balance'].split(' ');
userinfo.balance = parseFloat(steem_balance[0]);
}
info = {};
let currentInfo = userinfo;
info.info = userinfo;
req.session.info = info;
console.log(req.session.info);
return info;
}
async refresh(req) {
let info = req.session.info;
if(info){
return info;
}
let userName = req.session.username;
let ret = await steem.api.getAccountsAsync([userName]);
for(let k in ret){
let balance = new Array();
balance['sbd'] = ret[k]['sbd_balance'].split(' ');
balance['steem'] = ret[k]['balance'].split(' ');
info.info.balance = parseFloat(balance[req.query.currency][0]);
}
req.session.info = info;
return info;
}
async clear(req) {
let userName = req.session.username;
let ret = await steem.api.getAccountsAsync([userName]);
let info = {};
info.info = {
'bets' : 0,
'wins' : 0,
'losses' : 0,
'profit' : 0,
'wagered' : 0,
'balance' : 0,
};
info.currentInfo = {
'bets' : 0,
'wins' : 0,
'losses' : 0,
'profit' : 0,
'wagered' : 0,
'balance' : 0,
}
for(let k in ret){
let balance = new Array();
balance['sbd'] = ret[k]['sbd_balance'].split(' ');
balance['steem'] = ret[k]['balance'].split(' ');
info.info.balance = parseFloat(balance[req.query.currency][0]);
info.currentInfo.balance = parseFloat(balance[req.query.currency][0]);
info.info.success = 'true';
}
req.session.info = info;
return info;
}
async bet(req) {
req.setTimeout(500000);
let info = req.session.info;
let amount = (req.body.PayIn/100000000).toFixed(3);
let condition = 'under';
let currency = req.body.Currency.toLowerCase();
let target = 0;
target = Math.floor(req.body.Chance) + 1;
let cseed = Math.random().toString(36).substring(2);
let memo = 'BRoll ' + condition + ' ' + target + ' '+ cseed;
let bet = amount + ' '+ req.body.Currency.toUpperCase();
let userName = req.session.username;
let token = req.session.accessToken;
let kryptoGamesDice = 'kryptogames';
try{
let ret = await this._transfer(token, userName, kryptoGamesDice, bet, memo);
let data = await this._getBetInfo(ret.id, userName, cseed);
if(typeof data._id == "undefined") {
data = await this._getBetInfoFromUser(userName,ret.id, cseed);
}
if(typeof data._id != "undefined") {
data.amount = amount;
let betInfo = {};
betInfo.id = data._id;
betInfo.condition = '<';
betInfo.target = target;
betInfo.profit = (parseFloat(data.payout) - parseFloat(data.amount)).toFixed(8);
betInfo.roll_number = data.diceRoll;
betInfo.payout = parseFloat(data.payout).toFixed(8);
betInfo.amount = parseFloat(data.amount).toFixed(8);
info.info.balance = (parseFloat(info.info.balance) + parseFloat(betInfo.profit)).toFixed(8);
info.currentInfo.balance = (parseFloat(info.currentInfo.balance) + parseFloat(betInfo.profit)).toFixed(8);
info.info.bets++;
info.currentInfo.bets++;
info.info.profit = (parseFloat(info.info.profit) + parseFloat(betInfo.profit)).toFixed(8);
info.info.wagered = (parseFloat(info.info.wagered) + parseFloat(amount)).toFixed(8);
info.currentInfo.wagered = (parseFloat(info.currentInfo.wagered) + parseFloat(amount)).toFixed(8);
info.currentInfo.profit = (parseFloat(info.currentInfo.profit) + parseFloat(betInfo.profit)).toFixed(8);
if(data.won){
betInfo.win = true;
info.info.wins++;
info.currentInfo.wins++;
} else {
betInfo.win = false;
info.info.losses++;
info.currentInfo.losses++;
}
let returnInfo = {};
returnInfo.betInfo= betInfo;
returnInfo.info = info;
req.session.info = info;
return returnInfo;
} else {
throw new Error('bet data is null');
}
} catch(e) {
throw e;
}
}
async _getBetInfoFromUser(account, id, cseed){
let memoRegEx = /\{(.*)/;
return new Promise(async (resolve, reject) => {
try {
let options = {
url: ' https://api.steemit.com',
method: 'POST',
json: {
jsonrpc: '2.0',
method: 'condenser_api.get_account_history',
params: [account, -1, 1],
id: 1
},
timeout:10000
};
for(let tryQueryCount=0; tryQueryCount<20; tryQueryCount++) {
let data = await this._queryUserInfo(options,id,cseed);
if(data !== undefined){
tryQueryCount = 999;
console.log(data);
resolve(data)
} else {
console.log('Waiting for blockchain packing.....');
await this._sleep(15000);
}
}
resolve('not found')
} catch (e) {
reject( e );
}
});
}
async _getBetInfo(id, userName, cseed){
let memoRegEx = /\{(.*)/;
let tryQueryCount = 0;
return new Promise(( resolve, reject ) => {
let release = steem.api.streamOperations(async function (err, op) {
if (err) {
reject( err );
} else {
if (op[0] === "transfer" && op[1].to === userName) {
if (op[1].from === "kryptogames" && op[1].memo.startsWith("You")) {
tryQueryCount++;
try {
memoRegEx = /Client Seed: ([A-Za-z0-9]+),/;
let clientSeed = memoRegEx.exec(op[1].memo)[1] ;
if(clientSeed == cseed ){
release();
let memo = op[1].memo;
let steems = op[1].amount.split(' ');
let data = {};
console.log(memo);
data.payout = steems[0];
data._id = id;
memoRegEx = /Result: ([0-9]+),/;
data.diceRoll = memoRegEx.exec(op[1].memo)[1] ;
data.won = false;
if (memo.indexOf("Won")>0) {
data.won = true;
}
resolve(data);
}
} catch (e) {
reject( e );
}
}
if (op[1].from === "kryptogames" && !op[1].memo.startsWith("You")) {
release();
let memo = op[1].memo;
console.log(memo);
reject(memo);
}
}
}
if(tryQueryCount>=100){
release();
resolve({});
}
});
});
}
async _transfer(p,u,t,s,m){
return new Promise(( resolve, reject ) => {
steem.broadcast.transfer(p, u, t, s, m, function(err, result){
if(err) {
reject( err );
} else {
resolve( result );
}
});
});
}
async _sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
async _queryUserInfo(options, id, cseed){
let memoRegEx = /\{(.*)/;
return new Promise(( resolve, reject ) => {
let req = request.post(options,function (e, r, body) {
if(e) {
console.log('reject error');
reject( e );
} else {
if(body) {
let res = body.result;
for(let k in res) {
let tran = res[k][1].op;
try {
if (tran[0] == "transfer" && tran[1].from == "kryptogames" && tran[1].memo.startsWith("You")) {
memoRegEx = /Client Seed: ([A-Za-z0-9]+),/;
let clientSeed = memoRegEx.exec(tran[1].memo)[1] ;
console.log(clientSeed, cseed);
if(clientSeed == cseed ){
let memo = tran[1].memo;
let steems = tran[1].amount.split(' ');
let data = {};
console.log(memo);
data.payout = steems[0];
data._id = id;
memoRegEx = /Result: ([0-9]+),/;
data.diceRoll = memoRegEx.exec(tran[1].memo)[1] ;
data.won = false;
if (memo.indexOf("Won")>0) {
data.won = true;
}
resolve(data);
}
}
} catch (e) {
reject( e );
}
}
}
resolve();
}
});
});
}
}
Online Simulator
Download
- Binaries: https://github.com/mydicebot/mydicebot.github.io/releases
- Source Code: https://github.com/mydicebot/mydicebot.github.io
Supporting Dice Sites (alphabet sequence)
Traditional
Blockchain - STEEM
Quick Start
Download MyDiceBot Binaries here: MyDiceBot Releases.
Different execution methods on different platforms.
Linux (Open Terminal)
chmod +x mydicebot-linux./mydicebot-linuxMac (Open Terminal)
chmod +x mydicebot-macos./mydicebot-macosWindows (Open Command Prompt)
mydicebot-win.exe
Choose Dice Site, Input username/password/2FA/APIKey, then Login.
Bet and WIN.
Features
- Supported platforms: Windows, Mac, Linux, Web
- Supported programming languages: Lua and Javascript
- Supported multiple dice-sites
- Supported multiple strategies
- New account registration
- Existing account login
- Betting statistics
- Manual bet
- Auto bet
- Script bet (compatible with Seuntjies DiceBot scripts)
Internal Variables
- Single Bet Info
| Variable | Type | Permission | Purpose |
|---|---|---|---|
| basebet | double | Read Write | Shows the amount of the first bet. Only set for first bet. |
| previousbet | double | Read Only | Shows the amount of the previous bet. Only set after first bet. |
| nextbet | double | Read Write | The amount to bet in the next bet. You need to assign a value to this variable to change the amount bet. Defaults to previousbet after first bet. Needs to be set before betting can start. |
| chance | double | Read Write | The chance to win when betting. Defaults to value set in advanced settings if not set. Need to set this value to change the chance to win/payout when betting. |
| bethigh | bool | Read Write | Whether to bet high/over (true) or low/under(false). Defaults to true (bet high/bet over) |
| win | bool | Read Only | Indicates whether the last bet you made was a winning bet (true) or a losing bet (false). |
| currentprofit | double | Read Only | Shows the profit for the last bet made. This is not the amount returned. betting 1 unit at x2 payout, when winning, currentprofit will show 0.00000001 (returned =0.00000002), when losing, profit will show -0.00000001 |
- Current Session Info
| Variable | Type | Permission | Purpose |
|---|---|---|---|
| balance | double | Read Only | Lists your balance at the site you're logged in to. |
| bets | int | Read Only | Shows the number of bets for the current session. |
| wins | int | Read Only | Shows the number of wins for the current session. |
| losses | int | Read Only | Shows the number of losses for the current session. |
| profit | double | Read Only | Shows your session profit. Session is defined as the time since opening the current instance of bot or the last time you reset your stats in the bot. |
| currentstreak | double | Read Only | Shows the current winning or losing streak. When positive (>0), it's a winning streak. When negative (<0) it's a losing streak. Can never be 0. Only set after first bet. |
| currentroll | double | Read Only | Show current roll information |
Internal Functions
| Function | Purpose |
|---|---|
| dobet() | The loop of bets |
| stop() | Stop the bet |
Sample Code
- Strategy: Basic Martingale
- Using Lua
chance = 49.5
multiplier = 2
basebet = 0.00000010
bethigh = false
function dobet()
if profit >= 0.1 then
stop()
end
if win then
nextbet = basebet
else
nextbet = previousbet * multiplier
end
end
- Using Javascript
chance = 49.5;
multiplier = 2;
baseBet = 0.00000001;
betHigh = false;
function dobet() {
if (win) {
nextBet = basebet;
} else {
nextBet = previousbet * multiplier;
}
}
Report Issue
License
- GPL-3.0
Thanks
- Special thanks to the open source project of Seuntjies DiceBot.
- If you need simulation functions or advanced-autobet functions, we recommand Seuntjies DiceBot.
Quote
- "Gambling is gambling no matter what you do or how good your strategy is. The house always wins if you keep playing. Winners know when to stop."
- "Like any human, we make mistakes, and like any program, the bot is bound to have a few bugs. Use the bot at your own risk. "
Disclaimer
- This is still gambling. The bot is not guaranteed to win.
- Please do not gamble more than you can afford to lose.
- The bot has a lot of settings, and we cannot test each and every combination.
- The bot might behave unpredictable and unreliably with certain combinations of settings.
- Certain actions from the server might also result in unexpected behavior.
- We cannot be held responsible for any losses incurred while using the bot.
Legal
- It is your obligation to ensure compliance with any legislation relevant to your country of domicile regarding online gambling.
Contact
- github: https://github.com/mydicebot/mydicebot.github.io/issues
- steemit: https://steemit.com/@mydicebot
- bitcointalk: MyDiceBot - Cross-Platform | Multi-Script-Language | Multi-Site | Multi-Strategy
- discord: https://discord.gg/S6W5ec9
Donation
- DOGE: D9wMjdtGqsDZvjxWMjt66JLjE9E9nMAKb7
- steemit: @mydicebot