¡Bienvenid@!, ¿No eres miembro del Foro todavía? Registrarse ahora    


TUTORIAL  Chaturbate y sus paneles nuevos con imagen


#1

6
Como me preguntó Tu_palo por privado también lo pongo aquí.

Desde hace dos meses se puede poner una imagen en el panel que hay debajo de la ventana de video de Chaturbate en determinadas Apps.

El problema es que la App tiene que tener dentro de su codigo el template de "imagen" para mostrar una imagen en el panel de debajo. Esto quiere decir que la aplicación tiene que tener escrito dentro un codigo para poder usar imagenes, no puedes poner una imagen a cualquier aplicación.

Por otro lado el codigo de la app debe contener el Identificador (ID) que te da chaturbate al subir tu imagen. La imagen debe estar subida en la aplicacion que va mostrar la imagen, no vale subir una imagen en otra aplicación. La única forma de subir una imagen a una aplicación es que esa aplicación la hayas creado tu mismo. Todo el mundo puede crear aplicaciones copiando y pegando pero no todo el mundo sabe modificar el codigo de una App que previamente ha sido ofuscado (cifrado) para que no se pueda entender.


No puedes subir una imagen a una APP que no te pertenezca asi que todo esto es una putada ya que para tener una imagen tuya en una app ya creada tienes que hacer varias cosas:

-Localizar una app que tenga una imagen en el panel, eso quiere decir que la App está preparada para poner la imagen.

-Crear una app tu mismo con nombre, descripcion (lo que sea) y en el codigo javascript poner solo unas cuantas letras para que no te diga que el codigo es corto, creo que con mas de 8 letras es suficiente.

-En esa App tuya subes tu propi imagen o gif con las dimensiones del panel, son 270x69 o menos. te da un ID de imagen del tipo "05b83220-1ccc-4871-9333-70f97488de00" por ejemplo.

-Coges el codigo de la App que viste con imagen, lo copias entero y lo pegas en la tuya eliminado previamente esas letras que pusiste al principio. Modificas la ID de imagen que aparece por la tuya y ya tienes App con imagen. Ademas tendras que modificar todo lo que aparezca en el codigo de la aplicación que mencione a la modelo para la que fue creada.



Todo esto que parece un lio efectivamente es un lio. Si yo creo una app que permita imagenes en el panel y tu quieres poner tu propia imagen o me pasas la imagen y yo la subo a mi App y hago eso 4 mil veces o haces todo lo anterior.

Esto añade un mercado de gente creando imagenes y apps personalizadas para toda modelo que quiera tener un panel con imagen.

En el siguiente mensaje tendreís la explicación avanzada por si alguien se anima.

Tomamos la aplicacion de Lovense Lush por ejemplo, le añadimos el codigo que nos permite poner una imagen en el panel.

Creamos nuestra imagen de panel, 270x69 pixeles es lo máximo que se permite, recordad que las letras de los tokes y goals van a ir encima de la imagen.

Creamos nuestra app en chaturbate con el nombre que mas os guste. No se puede dejar en blanco la descripcion ni la parte del codigo asi que hay que poner algo, lo que sea, 10 letras por ejemplo.

Guardamos la app.

Nos vamos a la sección de codigo de la App y le damos a subir imagen, subimos nuestra imagen y nos dara una ID, muchos numeros, letras y guiones. copiaamos esa ID

Vamos a editar el codigo de la aplicación, buscamos
Código:
var backgroundImage = '38cdfc12-0d1a-4346-a2d5-53406072b7d0';
y en vez de 38cdfc.... ponemos nuesta ID de la imagen.

Guardamos la aplicación y ya tenemos una app con imagen en el panel.

En el codigo de App Lovense Lush que pongo a continuación las letras son "black" podeis cambiarlas si vuestra imagen es de color oscuro. Escoged un color HTML del tipo "#debdb6" (es un ejeplo de rosa palido) para sustituirlo por "black". Es sencillo, vais a google y poneis html codes y os saldra una pagina donde os dice que codigo corresponde a cada color.

Código:
function init() {
    cb.settings.goalMode && cb.settings.levelMode && cb.settings.messColor && (goalMode = goalModeList[cb.settings.goalMode].m, levelMode = levelModeList[cb.settings.levelMode].level, messColor = colorList[cb.settings.messColor].c), cb.settings.tags && (tags = cb.settings.tags.trim() ? cb.settings.tags : ""), (!tags || tags.toLowerCase().indexOf("Lovense") < 0) && (tags += "");
    var e = mySplit(tags);
    tags = "";
    for (var t = 0; t < e.length; t++) tags += "#" == e[t].substring(0, 1) ? e[t] : "#" + e[t];
    initNotice(), cb.settings.levelTitle && (levelTitle = cb.settings.levelTitle.trim() ? cb.settings.levelTitle : "Lovense Lush: Device that vibrates longer at Tips"), levelMode && initLevel(), noteNb || cbjs.arrayRemove(nextArray, "NOTE"), levelMode || cbjs.arrayRemove(nextArray, "LEVEL"), nextArray.length && (next = nextArray[nextIndex], cb.setTimeout(roomDisplay, 2e4)), runGoal(owner)
}

function doCommand(e, t) {
    var n = mySplit(t.toLowerCase()),
        o = n[0];
    return "goal" == o ? cmdGoal(e, n, t) : "sum" == o ? cmdSum(e) : "token" == o ? cmdToken(e, n) : void 0
}

function onTip(e, t) {
    actionIndic += 1, tipNb += 1, tipSum += t;
    var n = manageTotalList(e, t);
    if (n > maxSum && (maxSum = n, maxSumUsr = e), t > maxTip && (maxTip = t, maxTipUsr = e), goalOn) {
        goalSum += t, lastTipper = e, lastTip = t;
        var o = manageUserList(e, t);
        o > mvpSum && (mvpSum = o, mvpName = e), t > higherTip && (higherTip = t, higherTipName = e), "COUNTER" != goalMode && ("SINGLE" != goalMode || goalReached ? "MULTI" == goalMode && watchMultiGoal(e, t) : watchSingleGoal(t)), changePanel()
    }
}

function initNotice() {
    for (var e = 1; maxNotice >= e; e++) {
        var t = cb.settings["notice" + e] ? cb.settings["notice" + e].trim() : "";
        t && (noteList[++noteNb] = {
            note: t
        })
    }
}

function initLevel() {
    for (var e = 1; maxLevel >= e; e++) {
        var t = cb.settings["level" + e] ? cb.settings["level" + e].trim() : "";
        t && (levelNotice += "LIST" == levelMode ? sqr + t + skp : sqr + t)
    }
}

function runGoal(e) {
    goalOn = !0, goalReached = !1, remaining = setRemaining, goalNb = 0, goalSum = 0, goalUsrNb = 0, lastTipper = "", lastTip = 0, mvpName = "", mvpSum = 0, userList = {}, higherTipName = "", higherTip = 0, runNb++ && showGoalInfo(e), changeSubject(), changePanel()
}

function manageTotalList(e, t) {
    return e in totalList ? totalList[e].sum += t : totalList[e] = {
        sum: t,
        num: ++usrNb
    }, totalList[e].sum
}

function manageUserList(e, t) {
    return e in userList ? userList[e].sum += t : userList[e] = {
        sum: t,
        num: ++goalUsrNb
    }, userList[e].sum
}

function watchSingleGoal(e) {
    if (remaining -= e, !(remaining > 0)) {
        goalReached = !0, goalOn = !1, cb.changeRoomSubject(roomSubject + " Goal reached : " + goalSubject + " " + tags);
        var t = xLine(6);
        sendTitle(all, t + skp + "Goal Reached : Thanks you so much." + skp + t, cbColor), sendTitle(owner, skp + lck + owner + " : " + skp + sqr + "Use " + qt("/sum") + " for a Total Summary Board." + skp)
    }
}

function watchMultiGoal(e, t) {
    remaining -= t;
    var n = Math.floor(t / setRemaining);
    if (n += 0 >= remaining + n * setRemaining ? 1 : 0, goalNb += n, remaining += n * setRemaining, n) {
        var o = 1 == n ? " Goal " + goalNb : " Goals " + (goalNb - n + 1) + (2 == n ? " and " : " to ") + goalNb;
        sendTitle(all, sqr + sqr + sqr + qt(e) + " reached " + o + sqr + sqr + sqr, cbColor)
    }
}

function changeSubject() {
    var e = roomSubject;
    "COUNTER" != goalMode && (e += ("SINGLE" == goalMode ? " - Goal is : " : " - Multi-Goal :  ") + goalSubject), cb["changeRoomSubject"](e + " " + tags);
}

function changePanel() {
    return goalReached ? (row1 = "Goal Reached - Thanks all.", row2 = "", row3 = "Mvp - " + cut(mvpName) + " (" + mvpSum + ")", cb["drawPanel"]()) : goalOn ? "COUNTER" == goalMode ? (goalSum ? (row1 = x(usrNb, "Pleaser$") + (tokenOn ? " - " + x(goalSum, "Token$ Received") : ""), row2 = "Mvp - " + cut(mvpName) + " - " + mvpSum, row3 = "Newest - " + cut(lastTipper) + " - " + lastTip) : (row1 = "My Lovense - Vibrator that react to your Tips", row2 = "Start Playing", row3 = ""), cb["drawPanel"]()) : "MULTI" == goalMode ? (row1 = "Goal #" + (goalNb + 1) + " : " + (setRemaining - remaining) + " / " + setRemaining + " [ " + remaining + " Remaining ]" + (tokenOn && goalNb >= 1 ? " (" + goalSum + ")" : ""), goalSum ? (row2 = "Mvp - " + cut(mvpName) + " - " + mvpSum, row3 = "Newest - " + cut(lastTipper) + " - " + lastTip) : (row2 = "My Lovense - Vibrator that react to your Tips", row3 = "Start Playing"), cb["drawPanel"]()) : "SINGLE" == goalMode ? (row1 = tokenOn ? "Goal - " + goalSum + " / " + setRemaining + " [ " + remaining + " Remaining ]" : "Goal Remaining [ " + remaining + _0x2ac8[63], goalSum ? (row2 = "Mvp - " + cut(mvpName) + " - " + mvpSum, row3 = "Newest - " + cut(lastTipper) + " - " + lastTip) : (row2 = "My Lovense - Vibrator that react to your Tips", row3 = "Start Playing"), cb["drawPanel"]()) : void(0) : cb["drawPanel"]()
}

function cmdGoal(e, t, n) {
    if (1 == t.length) return showGoalInfo(e);
    var o = t[1];
    if (goalOn && 2 == t.length && (!isNaN(parseInt(o)) || ["counter", "single", "multi", "init"].indexOf(o) >= 0)) return void sendTitle(e, lck + skp + sqr + "Non updatable parameter when Goal is running. " + skp + "(Only Description is updatable)." + skp + sqr + "Use " + qt("/goal off") + " to stop running the Goal.");
    if ("off" == o && 2 == t.length) return sendTitle(e, skp + lck + "Goal Feature is confirmed OFF."), goalOn = !1, goalReached = !1, row1 = "", row2 = "", row3 = "", cb.drawPanel(), cb.changeRoomSubject(""), showGoalInfo(e);
    if ("on" == o && 2 == t.length) return goalOn ? void sendTitle(e, skp + lck + "Goal is already ON (Running)." + skp) : runGoal(e);
    if ("init" == o && 2 == t.length) return setRemaining = cb.settings.setRemaining, goalMode = goalModeList[cb.settings.goalMode].mode, goalSubject = cb.settings.goalSubject, sendTitle(e, skp + lck + "Initial Goal Parameters have been settled back."), showGoalInfo(e);
    var a = parseInt(o);
    return 2 != t.length || isNaN(a) ? 2 == t.length && "counter" == o ? (goalMode = "COUNTER", sendTitle(e, skp + lck + 'Goal-Mode has been settled at "COUNTER".' + skp + sqr + "(Tips Counter : Goal-Amount will not be used.)"), showGoalInfo(e, 2)) : 2 == t.length && "single" == o ? (goalMode = "SINGLE", sendTitle(e, skp + lck + 'Goal-Mode has been settled at "SINGLE".'), showGoalInfo(e, 2)) : 2 == t.length && "multi" == o ? (goalMode = "MULTI", sendTitle(e, skp + lck + 'Goal-Mode has been settled at "MULTI".'), showGoalInfo(e, 2)) : ["on", "off", "single", "multi", "counter", "init"].indexOf(o) >= 0 ? "Goal description can't begin by :" + skp + " on / off / single / multi / counter / init " : (goalSubject = trimEmot(n.substring(5)), sendTitle(e, skp + lck + "New Goal-Description has been settled."), goalOn && !goalReached && changeSubject(), void showGoalInfo(e, 3)) : 0 >= a ? "Goal amount must be >0." + skp + ' (It will not be used in mode "COUNTER").' : (setRemaining = a, sendTitle(e, skp + lck + "New Goal-Amount has been settled."), showGoalInfo(e, 1))
}

function showGoalInfo(e, t) {
    var n = "";
    (setRemaining != cb.settings.setRemaining || goalMode != goalModeList[cb.settings.goalMode].mode || goalSubject != cb.settings.goalSubject) && (n = sqr + qt("/goal init") + " if you want to restaure initial settings." + skp);
    var o = xLine(7),
        a = skp + o + skp + lck + "Goal Parameters :" + skp,
        i = sy(1, t) + "Amount : " + qt("/goal <X>") + " : " + setRemaining + skp + sy(2, t) + "Mode : " + qt("/goal [ single / multi / counter ]") + " : " + goalMode + skp + sy(3, t) + "Goal is : " + qt("/goal <description>") + " : " + goalSubject + skp + sqr + "Run goal : " + qt("/goal [ on / off ]") + " : " + (goalOn ? "ON" : "OFF") + (goalReached ? " - (Goal Reached) " : "") + skp,
        l = (goalOn ? lck + "Goal is ON (Running)." + skp + sqr + "Description (only) is updatable." + skp + sqr + qt("/goal off") + " to stop running the goal." + skp : lck + "Goal is OFF " + (goalReached ? "(Goal Reached). " : ".") + skp + (goalReached ? sqr + "(" + qt("/goal off") + " if you want to clear the screen.)" + skp : "") + sqr + "All parameters are updatable." + skp + n + sqr + qt("/goal on") + " to run the Goal." + skp) + o + skp;
    sendTitle(e, a), sendNote(e, i), sendTitle(e, l)
}

function sy(e, t) {
    return e == t ? trg : sqr
}

function cmdSum(e) {
    if (0 == tipNb) return sendTitle(e, lck + "SUMMARY : No Tipper yet.");
    var t = xLine(5),
        n = elapsTime(startTime, "[hms]"),
        o = skp + t + skp + lck + appName + skp + t + skp + sqr + "RunningTime : " + n + skp + sqr + " SUMMARY (since the App Started) :",
        a = "" + dot + x(usrNb, "Tipper$ / ") + x(Math.round(tipSum / usrNb), "token$ by Tipper.") + skp + dot + "Highest Tipper : " + qt(maxSumUsr) + " : " + x(maxSum, "Token$.") + skp + dot + "Highest Tip : " + qt(maxTipUsr) + " : " + x(maxTip, "Token$."),
        i = "" + t + skp + sqr + "Total received : " + x(tipSum, "Token$.") + skp + t + skp + sqr + qt("/sum") + " to display a Summary again.";
    sendTitle(e, o), sendNote(e, a), sendTitle(e, i)
}

function cmdToken(e, t) {
    return 1 == t.length ? sendTitle(e, skp + lck + "Token Received Setting is : " + (tokenOn ? "ON" : "OFF") + skp + dot + qt("/token on") + " : Display the Total Tokens received in Panel." + skp + dot + qt("/token off") + " : Stop display the Total Tokens received." + skp) : "on" == t[1] ? tokenOn ? sendTitle(e, lck + "Token Received Display already ON") : (tokenOn = !0, sendTitle(e, lck + "Token Received Display settled ON."), void(goalOn && changePanel())) : "off" == t[1] ? tokenOn ? (tokenOn = !1, goalOn && changePanel(), void sendTitle(e, lck + "Token Received Display settled OFF.")) : sendTitle(e, lck + "Token Received Display already OFF") : "Format : " + qt("/token <on/off>")
}

function roomDisplay() {
    var e = 1;
    actionIndic >= minAction && (nextDisplay(), actionIndic = 0, e = noteNb && "LEVEL" == next ? 1 : minuteNb), cb.setTimeout(roomDisplay, 6e4 * e)
}

function nextDisplay() {
    "LEVEL" == next ? levelDisplay(all) : "NOTE" == next && noteDisplay(), nextIndex = nextIndex >= nextArray.length - 1 ? 0 : nextIndex + 1, next = nextArray[nextIndex]
}

function noteDisplay() {
    cycleNum = cycleNum >= noteNb ? 1 : cycleNum + 1, sendTitle(all, noteList[cycleNum].note)
}

function levelDisplay(e) {
    "LINE" == levelMode ? sendTitle(e, skp + levelTitle + " : " + levelNotice + skp) : sendTitle(e, skp + levelTitle + " : " + skp + levelNotice)
}

function cut(e) {
    return qt(e.substring(0, 25))
}

function watchCommand(e) {
    for (var t in cmdList) {
        var n = e.toLowerCase().indexOf(t);
        if (n >= 0) {
            var o = mySplit(e.substring(n));
            return e.substring(n).replace(o[0], cmdList[t].cmd)
        }
    }
}

function errorCmd(e, t, n) {
    sendTitle(e, skp + lck + " Error command : /" + n + skp + sqr + t + skp)
}

function onTest(e) {
    var t = e.indexOf("tip");
    if (-1 != t) {
        var n = mySplit(e.substring(t));
        if (3 == n.length) {
            var o = n[1],
                a = parseInt(n[2]);
            isNaN(a) || 0 >= a || onTip(o, a)
        }
    }
}



function isOwner(e) {
    return e == cb.room_slug
}

function sendTitle(e, t, n) {
    var o = n ? n : messColor;
    o = isOwner(e) ? "#000000" : o, cb.sendNotice(t, e, "", o, "bolder")
}

function sendNote(e, t, n) {
    var o = n ? n : messColor;
    cb.sendNotice(t, e, "", o, "normal")
}

function trimEmot(e) {
    e = e.replace(/\[/g, ""), e = e.replace(/\]/g, "");
    for (var t = mySplit(e), n = 0; n < t.length; n++) ":" == t[n][0] && t[n].length > 1 && (e = e.replace(t[n], ""));
    return e
}

function mySplit(e) {
    return e.trim().replace(/\s+/g, " ").split(" ")
}

function myRandom(e, t) {
    return Math.floor(e + Math.random() * (t - e + 1))
}

function elapsTime(e, t) {
    var n = (new Date).getTime();
    return toHms(n, e, t)
}

function toHms(e, t, n) {
    var o = (e - t) / 1e3,
        a = o / 86400;
    a = a >= 1 ? a - a % 1 : 0;
    var i = (o - 3600 * a * 24) / 3600;
    i -= i % 1;
    var l = o % 3600 / 60;
    l -= l % 1;
    var s = o % 3600 - 60 * l;
    s -= s % 1;
    var r = a > 0 ? x(a, "Day$ ") : "",
        c = 10 > i ? "0" + i : i,
        m = 10 > l ? "0" + l : l,
        u = 10 > s ? "0" + s : s,
        p = r + c + ":" + m + ":" + u,
        g = n;
    return g = g.replace("day", r), g = g.replace("hour", "00" == c ? "" : x(i, "hour$ ")), g = g.replace("minute", "00" == m ? "" : x(l, "minute$ ")), g = g.replace("seconde", "00" == u ? "" : s + " sec"), g = g.replace("hms", p), g.replace(/ /g, "") ? g : "00"
}

function xLine(e) {
    var t = "";
    for (e *= 5; e--;) t += lne;
    return t
}

function qt(e) {
    return ' "' + e + '"'
}

function x(e, t) {
    return e + " " + t.replace("$", e > 1 ? "s" : "")
}

function y(e, t) {
    return t.replace("$", e > 1 ? "s" : "")
}
var appName = " [ Geni Lovense ] ",
    owner = cb.room_slug,
    startTime = (new Date).getTime(),
    yr = 16436,
    mth = 5,
    messColor = "#6900CC",
    cbColor = "#DC5500",
    all = "",
    skp = "\n",
    dot = " \\u2981 ",
    hrt = " \\u2665 ",
    sqr = " \\u25A0 ",
    trg = " \\u25B6 ",
    lne = "\\u2500",
    lck = " :w__lck ",
    wht = " :w__wht ";
cb.settings_choices = [{
    name: "roomSubject",
    label: "1. ROOM SETTINGS ........ Room Subject",
    type: "str",
    minLength: 1,
    maxLength: 150,
    required: !0,
    defaultValue: "Lovense Lush : Device that vibrates longer at your tips and gives me pleasures"
}, {
    name: "tags",
    label: "Tags (#) ",
    type: "str",
    minLength: 1,
    maxLength: 120,
    required: !1,
    defaultValue: "Lovense"
}, {
    name: "tokenOn",
    label: "Tokens",
    type: "choice",
    choice1: 'Display "Total Received" in Panel',
    choice2: "Not displayed",
    "default": 'Display "Total Received" in Panel'
}, {
    name: "messColor",
    label: "2. NOTICES SETTINGS ... - Display Color",
    type: "choice",
    choice1: "Orange",
    choice2: "Blue",
    choice3: "Purple",
    choice4: "Pink",
    choice5: "Dark_Red",
    choice6: "Black",
    defaultValue: "Dark_Red"
}, {
    name: "minuteNb",
    label: " (minutes) - Display Time ",
    type: "int",
    minValue: 1,
    maxValue: 30,
    defaultValue: 1
}, {
    name: "levelMode",
    label: "- Notification of Lovense-Levels",
    type: "choice",
    choice1: "NO (next info will not be used)",
    choice2: "YES - Mode List",
    choice3: "YES - Single Line",
    defaultValue: "YES - Mode List"
}, {
    name: "levelTitle",
    label: "Level Title",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !0,
    defaultValue: "MY LOVENSE LUSH VIBRATOR IS SET TO REACT TO YOUR TIPS. THERE ARE 5 LEVELS OF INTENSITY OR RANDOMLY CHOOSE A LEVEL FROM 1-5 "
}, {
    name: "level1",
    label: "Level 1 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !1,
    defaultValue: "Level 1 - Tip (1-14) 3 seconds (Low vibrations)"
}, {
    name: "level2",
    label: "Level 2 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !1,
    defaultValue: "Level 2 - Tip (15-99) 6 seconds (Medium vibrations)"
}, {
    name: "level3",
    label: "Level 3 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !1,
    defaultValue: "Level 3 - Tip (100-499) 10 seconds (Medium vibrations)"
}, {
    name: "level4",
    label: "Level 4 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !1,
    defaultValue: "Level 4 - Tip (500-999) 1 Minute (High vibrations)"
}, {
    name: "level5",
    label: "Level 5 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !1,
    defaultValue: "Level 5 - Tip (1000 - 1000+) 3 Minutes (High vibrations)"
}, {
    name: "RandomLevel",
    label: "Random Level ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !1,
    defaultValue: "Random Lvl - Tip (200) To get a random level!"
}, {
    name: "notice1",
    label: "- Optional Additional ...... Notice 1 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !1,
    defaultValue: "Lovense Lush : Device that vibrates longer on your Tips!"
}, {
    name: "notice2",
    label: "Notice 2 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !1,
    defaultValue:" :Lovense Lush Give me pleasure with your tips!"
}, {
    name: "notice3",
    label: "Notice 3 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
    required: !1,
    defaultValue: " : Lovense info \n Give me pleasure with your tips!!!"

}, {    name: 'Auto1',
    type: 'choice',
    choice1: 'yes',
    choice2: 'no',
    defaultValue: 'no',
    label: "Auto thank you active with tips? (notices have different colors)"
},{
    name: "Thanks15",
    label: "Thank you for 15 to 99 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
        defaultValue: "I love it, thank you!!"
}, {
    name: "Thanks100",
    label: "Thank you for 100 to 499 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
        defaultValue: "You know how to make me happy! Thank you!!"
}, {
    name: "Thanks500",
    label: "Thank you for 500 to 999 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
        defaultValue: "Thank you so much for giving me this pleasure!!"
}, {
    name: "Thanks1000",
    label: "Thank you for 1000+ ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
        defaultValue: "OMG!!! I love it!! THANK YOU SO MUCH!! "
}, {
    name: "Thanks200",
    label: "Thank you for 200 ",
    type: "str",
    minLength: 0,
    maxLength: 10240,
        defaultValue: "Thank you for the random lvl suprise!! "
}, {




    name: "goalMode",
    label: "3. GOAL SETTINGS - Will you use a Goal",
    type: "choice",
    choice1: "NO (next info will not be used)",
    choice2: "Single Goal",
    choice3: "Multi Goals (Repeated)",
    "default": "NO (next info will not be used)"
}, {
    name: "goalSubject",
    label: "Goal is ....",
    type: "str",
    minLength: 1,
    maxLength: 200,
    required: !0,
    defaultValue: "A surprise"
}, {
    name: "setRemaining",
    label: "Amount",
    type: "int",
    minValue: 0,
    maxValue: 9999999,
    defaultValue: 2e3
}];
var minuteNb = parseInt(cb.settings.minuteNb),
    minAction = 5,
    actionIndic = minAction,
    cycleNum = 0,
    nextArray = ["LEVEL", "NOTE"],
    nextIndex = 0,
    next = "",
    roomSubject = cb.settings.roomSubject,
    levelTitle = "",
    maxLevel = 6,
    levelMode = "",
    levelNotice = "",
    levelModeList = {};
levelModeList["NO (next info will not be used)"] = {
    level: ""
}, levelModeList["YES - Mode List"] = {
    level: "LIST"
}, levelModeList["YES - Single Line"] = {
    level: "LINE"
};
var maxNotice = 3,
    noteList = {},
    noteNb = 0,
    tipSum = 0,
    tipNb = 0,
    lastTipper = "",
    lastTip = 0,
    mvpName = "",
    mvpSum = 0,
    userList = {},
    higherTip = 0,
    higherTipName = "",
    totalList = {},
    usrNb = 0,
    maxSum = 0,
    maxSumUsr = "",
    maxTip = 0,
    maxTipUsr = "",
    Auto1 = cb.settings.Auto1,
    Thanks15 = cb.settings.Thanks15,
    Thanks100 = cb.settings.Thanks100,
    Thanks500 = cb.settings.Thanks500,
    Thanks1000 = cb.settings.Thanks1000,

    tokenOn = "Not displayed" == cb.settings.tokenOn ? !1 : !0,
    goalMode = "",
    goalSubject = cb.settings.goalSubject,
    setRemaining = parseInt(cb.settings.setRemaining),
    goalOn = !0,
    goalReached = !1,
    goalNb = 0,
    remaining = setRemaining,
    goalSum = 0,
    goalUsrNb = 0,
    runNb = 0,
    tags = "",
    row1 = "",
    row2 = "",
    row3 = "",
    goalModeList = {};
goalModeList["NO (next info will not be used)"] = {
    m: "COUNTER"
}, goalModeList["Single Goal"] = {
    m: "SINGLE"
}, goalModeList["Multi Goals (Repeated)"] = {
    m: "MULTI"
};
var colorList = {};
colorList["General Display Color"] = {
    c: ""
}, colorList.Orange = {
    c: "#DC5500"
}, colorList.Blue = {
    c: "#6900CC"
}, colorList.Purple = {
    c: "#323F75"
}, colorList.Pink = {
    c: "#FA5858"
}, colorList.Dark_Red = {
    c: "#9F000F"
}, colorList.Black = {
    c: "#000000"
};
var cmdList = {};
cmdList["/goa"] = {
    cmd: "goal"
}, cmdList["!goa"] = {
    cmd: "goal"
}, cmdList["/sum"] = {
    cmd: "sum"
}, cmdList["!sum"] = {
    cmd: "sum"
}, cmdList["/tok"] = {
    cmd: "token"
}, cmdList["!tok"] = {
    cmd: "token"
}, cb.onEnter(function(e) {
    var t = e.user;
    isOwner(t) || levelMode && levelDisplay(t)
}), cb.onMessage(function(e) {
    {
        var t = e.user,
            n = e.m,
            o = e.is_mod;
        !e.has_tokens
    }
    if (e.hasOwnProperty("X-Spam") && e["X-Spam"]) return e;
    if (isOwner("geni_xxx") && onTest(e.m), isOwner) {
        var a = watchCommand(n);
        if (a) {
            var i = doCommand(t, a, o);
            i && errorCmd(t, i, a), e.m = "", e["X-Spam"] = !0
        }
    }
    actionIndic += 1
}),

cb.onTip(function(e) {
    var t = parseInt(e.amount),
        n = e.from_user;
    onTip(n, t);
  if (cb.settings.Auto1 == 'yes'){
   if (e['amount'] >14 && e['amount']<100) {
            cb.chatNotice(Thanks15, "", '#FFFFFF', '#00FFFF', 'bold');
         }
        if (e['amount'] >99 && e['amount']<500) {
            cb.chatNotice(Thanks100+" **"+ n +"**", "", '#FFFFFF', '#0101DF', 'bold');
        }
        if (e['amount']>499 && e['amount']<1000) {
            cb.chatNotice(Thanks500+" ***"+ n +"***", "",  '#FFFFFF', '#FF0000', 'bold');
        }
        if (e['amount']>999) {
            cb.chatNotice(Thanks1000+" *****"+ n +"*****", "", '#FFFFFF', '#FA58F4', 'bold');    
}
}
  
}),
var backgroundImage = '38cdfc12-0d1a-4346-a2d5-53406072b7d0';
var tips = row1;
var highest = row2;
var last = row3;
var fontSize = 11;

cb.onDrawPanel(function(user) {
  return {
      "template": "image_template",
      "layers": [
          {'type': 'image', 'fileID': backgroundImage},
          {
              'type': 'text',
              'text': row1,
              'top': 6,
              'left': 30,
              'font-size': 12,
              //'text-align': 'center',
              'font-weight': 'bold',
               'color': 'black',
          },
          {
            'type': 'text',
            'text': row2,
            'top': 29,
            'left': 30,
            'font-size': 11,
           // 'text-align': 'center',
            //'font-weight': 'bold',
             'color': 'black',
         },
          {
             'type': 'text',
             'text': row3,
             'top': 51,
             'left': 30,
            'font-size': 11,
            // 'text-align': 'center',
            //'font-weight': 'bold',
             'color': 'black',
          },
      ],
    };
});
cb.drawPanel();
init();
Último(s) agradecimiento(s)

amyfox69 Marilyn777 Senka_spanks katthya  ClaudiaKiss  Lulú 
Ver todos
[Imagen: recruitment_468x60_01.gif]
Responder

#2

1
Ya teneis en chaturbate Tip Goal con Panel customizable

https://es.chaturbate.com/apps/app_detai...on=&slot=0

En este caso podeis crear vuestra propia APP, pegar el codigo, subir vuestra imagen (270x69 pixeles) y antes de lanzar la aplicacion cambiar el ID de la imagen por la vuestra en el panel de Lanzamiento.
Último(s) agradecimiento(s)

Eva25 
Ver todos
[Imagen: recruitment_468x60_01.gif]
Responder

#3

3
(05-24-2018, 04:49 PM)Silici0 escribió: Ya teneis en chaturbate Tip Goal con Panel customizable

https://es.chaturbate.com/apps/app_detai...on=&slot=0

En este caso podeis crear vuestra propia APP, pegar el codigo, subir vuestra imagen (270x69 pixeles) y antes de lanzar la aplicacion cambiar el ID de la imagen por la vuestra en el panel de Lanzamiento.



[Imagen: 35dc1sz.png]


[Imagen: 33bfq7d.png]


[Imagen: 238npz.png]


[Imagen: ofwr5k.png]


[Imagen: 2n07qxg.png]
Último(s) agradecimiento(s)

Senka_spanks cuervo katthya 
Ver todos
[Imagen: recruitment_468x60_01.gif]
Responder

#4

1
Ya modifiqué también el Auto Reset Tip Goal para que pueda contener imagenes en el panel
Auto-Reset Tip Goal Panel +

Al igual que el Tip goal Panel + se puede usar tal como está y elegir una de las imagenes por defecto (y el panel con colores) o copiar y pegar la app en la vuestra propia subiendo vuestra imagen y pegando el ID de la imagen en el cuadro de dialogo del lanzamiento de la APP. Si haceis esto ultimo solo funcionará vuestra imagen, las demás no.



Este ofrecimiento solo es válido hasta el 15 de junio, luego ya me dedicaré a otras cosas y no voy poder subir imágenes.

Si alguien necesita que suba una imagen a alguna de las 2 apps que ponga aqui el link de wetransfer con la imagen o gif de 270x69 pixeles, solo subiré las imagenes que tengan ese tamaño o inferior ya que mas grandes no valen y no voy a modificarlas. Según vaya transformando las demás apps como Token Keno, Lovense-Me, Crazy Ticket no me cuesta nada subir también esa imagen vuestra.

Crear una imagen con un programa como Gimp es realtivamente sencillo. Si ya queréis modificar un gif, añadirle vuestro nombre y darle el tamaño 270x69 tendréis que mirar un tutorial.
Último(s) agradecimiento(s)

Senka_spanks 
Ver todos
[Imagen: recruitment_468x60_01.gif]
Responder

#5

0
(05-30-2018, 09:51 AM)Silici0 escribió: Ya modifiqué también el Auto Reset Tip Goal para que pueda contener imagenes en el panel
Auto-Reset Tip Goal Panel +

Al igual que el Tip goal Panel + se puede usar tal como está y elegir una de las imagenes por defecto (y el panel con colores) o copiar y pegar la app en la vuestra propia subiendo vuestra imagen y pegando el ID de la imagen en el cuadro de dialogo del lanzamiento de la APP. Si haceis esto ultimo solo funcionará vuestra imagen, las demás no.



Este ofrecimiento solo es válido hasta el 15 de junio, luego ya me dedicaré a otras cosas y no voy poder subir imágenes.

Si alguien necesita que suba una imagen a alguna de las 2 apps que ponga aqui el link de wetransfer con la imagen o gif de 270x69 pixeles, solo subiré las imagenes que tengan ese tamaño o inferior ya que mas grandes no valen y no voy a modificarlas. Según vaya transformando las demás apps como Token Keno, Lovense-Me, Crazy Ticket no me cuesta nada subir también esa imagen vuestra.

Crear una imagen con un programa como Gimp es realtivamente sencillo. Si ya queréis modificar un gif, añadirle vuestro nombre y darle el tamaño 270x69 tendréis que mirar un tutorial.
Como veo que no hay ninguna para hombres te voy a dejar 2 jaja.        

Responder

#6

0
Vale pero el primero es horrible jajaja y el segundo es mas alto de 69 pixeles y no se verá.

Cualquier imagen que supere los limites chaturbate no la muestra en el panel. Y si la imagen es menor de 270x69 entonces sale centrada. Lo que he hice con los gif pequeños es ponerlos donde yo quiero que salgan en una imagen transparente de 270x69.

El template de panel os permite poner una imagen pequeña en una posicion determinada dando las coordenadas pero como mi codigo es para todas las imágenes posibles la posición de la imagen es centrada por defecto.
[Imagen: recruitment_468x60_01.gif]
Responder

#7

0
(05-31-2018, 09:05 AM)Silici0 escribió: Vale pero el primero es horrible jajaja y el segundo es mas alto de 69 pixeles y no se verá.

Cualquier imagen que supere los limites chaturbate no la muestra en el panel. Y si la imagen es menor de 270x69 entonces sale centrada. Lo que he hice con los gif pequeños es ponerlos donde yo quiero que salgan en una imagen transparente de 270x69.

El template de panel os permite poner una imagen pequeña en una posicion determinada dando las coordenadas pero como mi codigo es para todas las imágenes posibles la posición de la imagen es centrada por defecto.
Jajaja horrible para según quienes y no me refiero a ti eh?
el segundo es un gif de chaturbate si quieres lo reduzco y lo subo de nuevo...
Responder

#8

0
No te preocupes ya lo hice yo, en unas horas lo subo.
[Imagen: recruitment_468x60_01.gif]
Responder

#9

0
(05-24-2018, 06:01 PM)Silici0 escribió:
(05-24-2018, 04:49 PM)Silici0 escribió: Ya teneis en chaturbate Tip Goal con Panel customizable

https://es.chaturbate.com/apps/app_detai...on=&slot=0

En este caso podeis crear vuestra propia APP, pegar el codigo, subir vuestra imagen (270x69 pixeles) y antes de lanzar la aplicacion cambiar el ID de la imagen por la vuestra en el panel de Lanzamiento.



[Imagen: 35dc1sz.png]


[Imagen: 33bfq7d.png]


[Imagen: 238npz.png]


[Imagen: ofwr5k.png]


[Imagen: 2n07qxg.png]


Hola disculpa...

Nosotros hemos creado un par de imágenes con esas dimensiones, pero la verdad es que no sabemos muy bien donde es que se debe modificar el código o que es lo que debemos hacer....podrías dar una pequeña "guía" de como es que se hace?

Gracias de antemano.
Responder

#10

0
En el caso de mis dos aplicaciones con panel no hay que modificar nada. Copias, pegas, subes la imagen y pones el ID de la imagen en el espacio que hay para ello en el panel de lanzamiento de la aplicación. En las aplicaciones copiadas solo funciona la imagen que vosotros subáis.
[Imagen: recruitment_468x60_01.gif]
Responder

#11
Sad 

0
(06-14-2018, 12:21 PM)TjModels escribió:
(05-24-2018, 06:01 PM)Silici0 escribió:
(05-24-2018, 04:49 PM)Silici0 escribió: Ya teneis en chaturbate Tip Goal con Panel customizable

https://es.chaturbate.com/apps/app_detai...on=&slot=0

En este caso podeis crear vuestra propia APP, pegar el codigo, subir vuestra imagen (270x69 pixeles) y antes de lanzar la aplicacion cambiar el ID de la imagen por la vuestra en el panel de Lanzamiento.



[Imagen: 35dc1sz.png]


[Imagen: 33bfq7d.png]


[Imagen: 238npz.png]


[Imagen: ofwr5k.png]


[Imagen: 2n07qxg.png]


Hola disculpa...

Nosotros hemos creado un par de imágenes con esas dimensiones, pero la verdad es que no sabemos muy bien donde es que se debe modificar el código o que es lo que debemos hacer....podrías dar una pequeña "guía" de como es que se hace?

Gracias de antemano.


Ej es que precisamente no sabemos donde es que se modifica
Responder

#12

0
A ver silo que estas preguntando es como crear una app nueva porque lo otro es bien sencillo, no hay que modificar nada del codigo de la aplicación.

Tienes que copiar el Source code de la app, crear una app nueva y pegar el codigo, subir la imagen y copiar el ID de la imagen que te muestras chaturbate.

En "Select an image ID. You can see all the images in the top of Code Source section"
Seleccionas "Image ID written in the next section" porque tu no quieres usar una imagen ID de la app sino una propia con un ID te da chaturbate al subir la imagen.

En la siguiente casilla pones el ID de tu imagen y ya está, donde pone" Image Panel configuration, select: Image ID written... first, (useful if you copy these app to upload your own image):"


Si esto te resulta complicado simplemente pon aqui las imagenes y las subo yo a la aplicación.
[Imagen: recruitment_468x60_01.gif]
Responder

#13

0
Bueno pues aun no entendemos que es lo que en el código se reemplaza...

Así que te subimos la foto...

http://i64.tinypic.com/2i1cjkw.jpg
Responder

#14

1
Para el Auto Reset Tip goal usa el ID: b5f3c874-4985-4a10-bf38-c607161e8c85
Para el Tip goal el ID: bdf9842c-6a1e-4992-bf1b-724a6940ef57

En el panel de la app solo hay un sitio para poner los ID de imagen, no te puedes confundir. Debes marcar primero la opción "Voy a usar el ID escrito en la siguiete sección" "Image ID written in the next section"
Último(s) agradecimiento(s)

Marilyn777 
Ver todos
[Imagen: recruitment_468x60_01.gif]
Responder

#15

0
(06-15-2018, 11:38 AM)TjModels escribió: Bueno pues aun no entendemos que es lo que en el código se reemplaza...

Así que te subimos la foto...

http://i64.tinypic.com/2i1cjkw.jpg

Disculpa, me gustaría saber si al poner esta aplicación, no puedo utilizar el Lovense, es decir solo se puede de a una APP? No funciona como BOT?
Responder

#16

0
Las apps de chaturbate son las unicas que pueden manejar el panel del video. Para hacer el show con lovense y una app con imagen en el panel tienes muchas opciones:

Usar tip goal o autoreset panel + con la app oficial del vibrador lovense en el navegador o con el navegador de lovense. Seria lo logico si tienes lovense.

Usar tipgoal o auto reset panel + con el script que envia las notificaciones de lovense instalado en el navegador. Es facil de encontrar y de insralar. Se comporta como la app oficial de lovense lanzando los avisos desde la cuenta de la modelo.

Usar tip goal o auto reset panel + con un bot de chaturbate de lovense. Yo tengo uno y habra muchos mas.

Usar tipgoal y autoreset panel+ con cualquier bot de notificaciones poniendo los textos de lovense. Con un simple rotating notifier se puede hacer.

Usar la app de lovense que puse al principio del post modificandola como indico para tener imagen propia.

Coger otra app con imagen en el panel de chaturbate, modificarla y poner la imagen propia.
[Imagen: recruitment_468x60_01.gif]
Responder

#17

0
hola, muy bien esto de las imágenes me ayudo bastante, y me gustaria saber si usted sabe como se configura para que le salga en la pantalla donde se ve la imagen los usuarios que dan los tkns si me entiende? sale el letrero con el nombre del usuario y lo que dio pero no como un top lover si no en la pantalla donde transmite uno. si sabe me puede explicar por favor
Responder

#18

0
Silici0, gracias por tus explicaciones ya que son de mucha utilidad. Bueno por otro lado yo tambien he creado mis propias apps y me encantaría saber como se realiza la ofuscacion de los codigos, ya que me gustaria proteger estos codigos.

De antemano agradezco tu porptuna guia y colaboracion.

Que tengas un escelente día!
Responder

#19

0
(05-23-2018, 11:17 PM)Pero porque se podria dar que sale un error que no permite guardar la app, dice que es un error de java con el chat! escribió: Como me preguntó Tu_palo por privado también lo pongo aquí.

Desde hace dos meses se puede poner una imagen en el panel que hay debajo de la ventana de video de Chaturbate en determinadas Apps.

El problema es que la App tiene que tener dentro de su codigo el template de "imagen" para mostrar una imagen en el panel de debajo. Esto quiere decir que la aplicación tiene que tener escrito dentro un codigo para poder usar imagenes, no puedes poner una imagen a cualquier aplicación.

Por otro lado el codigo de la app debe contener el Identificador (ID) que te da chaturbate al subir tu imagen. La imagen debe estar subida en la aplicacion que va mostrar la imagen, no vale subir una imagen en otra aplicación. La única forma de subir una imagen a una aplicación es que esa aplicación la hayas creado tu mismo. Todo el mundo puede crear aplicaciones copiando y pegando pero no todo el mundo sabe modificar el codigo de una App que previamente ha sido ofuscado (cifrado) para que no se pueda entender.


No puedes subir una imagen a una APP que no te pertenezca asi que todo esto es una putada ya que para tener una imagen tuya en una app ya creada tienes que hacer varias cosas:

-Localizar una app que tenga una imagen en el panel, eso quiere decir que la App está preparada para poner la imagen.

-Crear una app tu mismo con nombre, descripcion (lo que sea) y en el codigo javascript poner solo unas cuantas letras para que no te diga que el codigo es corto, creo que con mas de 8 letras es suficiente.

-En esa App tuya subes tu propi imagen o gif con las dimensiones del panel, son 270x69 o menos. te da un ID de imagen del tipo "05b83220-1ccc-4871-9333-70f97488de00" por ejemplo.

-Coges el codigo de la App que viste con imagen, lo copias entero y lo pegas en la tuya eliminado previamente esas letras que pusiste al principio. Modificas la ID de imagen que aparece por la tuya y ya tienes App con imagen. Ademas tendras que modificar todo lo que aparezca en el codigo de la aplicación que mencione a la modelo para la que fue creada.



Todo esto que parece un lio efectivamente es un lio. Si yo creo una app que permita imagenes en el panel y tu quieres poner tu propia imagen o me pasas la imagen y yo la subo a mi App y hago eso 4 mil veces o haces todo lo anterior.

Esto añade un mercado de gente creando imagenes y apps personalizadas para toda modelo que quiera tener un panel con imagen.

En el siguiente mensaje tendreís la explicación avanzada por si alguien se anima.

Tomamos la aplicacion de Lovense Lush por ejemplo, le añadimos el codigo que nos permite poner una imagen en el panel.

Creamos nuestra imagen de panel, 270x69 pixeles es lo máximo que se permite, recordad que las letras de los tokes y goals van a ir encima de la imagen.

Creamos nuestra app en chaturbate con el nombre que mas os guste. No se puede dejar en blanco la descripcion ni la parte del codigo asi que hay que poner algo, lo que sea, 10 letras por ejemplo.

Guardamos la app.

Nos vamos a la sección de codigo de la App y le damos a subir imagen, subimos nuestra imagen y nos dara una ID, muchos numeros, letras y guiones. copiaamos esa ID

Vamos a editar el codigo de la aplicación, buscamos
Código:
var backgroundImage = '38cdfc12-0d1a-4346-a2d5-53406072b7d0';
y en vez de 38cdfc.... ponemos nuesta ID de la imagen.

Guardamos la aplicación y ya tenemos una app con imagen en el panel.

En el codigo de App Lovense Lush que pongo a continuación las letras son "black" podeis cambiarlas si vuestra imagen es de color oscuro. Escoged un color HTML del tipo "#debdb6" (es un ejeplo de rosa palido) para sustituirlo por "black". Es sencillo, vais a google y poneis html codes y os saldra una pagina donde os dice que codigo corresponde a cada color.

Código:
function init() {
   cb.settings.goalMode && cb.settings.levelMode && cb.settings.messColor && (goalMode = goalModeList[cb.settings.goalMode].m, levelMode = levelModeList[cb.settings.levelMode].level, messColor = colorList[cb.settings.messColor].c), cb.settings.tags && (tags = cb.settings.tags.trim() ? cb.settings.tags : ""), (!tags || tags.toLowerCase().indexOf("Lovense") < 0) && (tags += "");
   var e = mySplit(tags);
   tags = "";
   for (var t = 0; t < e.length; t++) tags += "#" == e[t].substring(0, 1) ? e[t] : "#" + e[t];
   initNotice(), cb.settings.levelTitle && (levelTitle = cb.settings.levelTitle.trim() ? cb.settings.levelTitle : "Lovense Lush: Device that vibrates longer at Tips"), levelMode && initLevel(), noteNb || cbjs.arrayRemove(nextArray, "NOTE"), levelMode || cbjs.arrayRemove(nextArray, "LEVEL"), nextArray.length && (next = nextArray[nextIndex], cb.setTimeout(roomDisplay, 2e4)), runGoal(owner)
}

function doCommand(e, t) {
   var n = mySplit(t.toLowerCase()),
       o = n[0];
   return "goal" == o ? cmdGoal(e, n, t) : "sum" == o ? cmdSum(e) : "token" == o ? cmdToken(e, n) : void 0
}

function onTip(e, t) {
   actionIndic += 1, tipNb += 1, tipSum += t;
   var n = manageTotalList(e, t);
   if (n > maxSum && (maxSum = n, maxSumUsr = e), t > maxTip && (maxTip = t, maxTipUsr = e), goalOn) {
       goalSum += t, lastTipper = e, lastTip = t;
       var o = manageUserList(e, t);
       o > mvpSum && (mvpSum = o, mvpName = e), t > higherTip && (higherTip = t, higherTipName = e), "COUNTER" != goalMode && ("SINGLE" != goalMode || goalReached ? "MULTI" == goalMode && watchMultiGoal(e, t) : watchSingleGoal(t)), changePanel()
   }
}

function initNotice() {
   for (var e = 1; maxNotice >= e; e++) {
       var t = cb.settings["notice" + e] ? cb.settings["notice" + e].trim() : "";
       t && (noteList[++noteNb] = {
           note: t
       })
   }
}

function initLevel() {
   for (var e = 1; maxLevel >= e; e++) {
       var t = cb.settings["level" + e] ? cb.settings["level" + e].trim() : "";
       t && (levelNotice += "LIST" == levelMode ? sqr + t + skp : sqr + t)
   }
}

function runGoal(e) {
   goalOn = !0, goalReached = !1, remaining = setRemaining, goalNb = 0, goalSum = 0, goalUsrNb = 0, lastTipper = "", lastTip = 0, mvpName = "", mvpSum = 0, userList = {}, higherTipName = "", higherTip = 0, runNb++ && showGoalInfo(e), changeSubject(), changePanel()
}

function manageTotalList(e, t) {
   return e in totalList ? totalList[e].sum += t : totalList[e] = {
       sum: t,
       num: ++usrNb
   }, totalList[e].sum
}

function manageUserList(e, t) {
   return e in userList ? userList[e].sum += t : userList[e] = {
       sum: t,
       num: ++goalUsrNb
   }, userList[e].sum
}

function watchSingleGoal(e) {
   if (remaining -= e, !(remaining > 0)) {
       goalReached = !0, goalOn = !1, cb.changeRoomSubject(roomSubject + " Goal reached : " + goalSubject + " " + tags);
       var t = xLine(6);
       sendTitle(all, t + skp + "Goal Reached : Thanks you so much." + skp + t, cbColor), sendTitle(owner, skp + lck + owner + " : " + skp + sqr + "Use " + qt("/sum") + " for a Total Summary Board." + skp)
   }
}

function watchMultiGoal(e, t) {
   remaining -= t;
   var n = Math.floor(t / setRemaining);
   if (n += 0 >= remaining + n * setRemaining ? 1 : 0, goalNb += n, remaining += n * setRemaining, n) {
       var o = 1 == n ? " Goal " + goalNb : " Goals " + (goalNb - n + 1) + (2 == n ? " and " : " to ") + goalNb;
       sendTitle(all, sqr + sqr + sqr + qt(e) + " reached " + o + sqr + sqr + sqr, cbColor)
   }
}

function changeSubject() {
   var e = roomSubject;
   "COUNTER" != goalMode && (e += ("SINGLE" == goalMode ? " - Goal is : " : " - Multi-Goal :  ") + goalSubject), cb["changeRoomSubject"](e + " " + tags);
}

function changePanel() {
   return goalReached ? (row1 = "Goal Reached - Thanks all.", row2 = "", row3 = "Mvp - " + cut(mvpName) + " (" + mvpSum + ")", cb["drawPanel"]()) : goalOn ? "COUNTER" == goalMode ? (goalSum ? (row1 = x(usrNb, "Pleaser$") + (tokenOn ? " - " + x(goalSum, "Token$ Received") : ""), row2 = "Mvp - " + cut(mvpName) + " - " + mvpSum, row3 = "Newest - " + cut(lastTipper) + " - " + lastTip) : (row1 = "My Lovense - Vibrator that react to your Tips", row2 = "Start Playing", row3 = ""), cb["drawPanel"]()) : "MULTI" == goalMode ? (row1 = "Goal #" + (goalNb + 1) + " : " + (setRemaining - remaining) + " / " + setRemaining + " [ " + remaining + " Remaining ]" + (tokenOn && goalNb >= 1 ? " (" + goalSum + ")" : ""), goalSum ? (row2 = "Mvp - " + cut(mvpName) + " - " + mvpSum, row3 = "Newest - " + cut(lastTipper) + " - " + lastTip) : (row2 = "My Lovense - Vibrator that react to your Tips", row3 = "Start Playing"), cb["drawPanel"]()) : "SINGLE" == goalMode ? (row1 = tokenOn ? "Goal - " + goalSum + " / " + setRemaining + " [ " + remaining + " Remaining ]" : "Goal Remaining [ " + remaining + _0x2ac8[63], goalSum ? (row2 = "Mvp - " + cut(mvpName) + " - " + mvpSum, row3 = "Newest - " + cut(lastTipper) + " - " + lastTip) : (row2 = "My Lovense - Vibrator that react to your Tips", row3 = "Start Playing"), cb["drawPanel"]()) : void(0) : cb["drawPanel"]()
}

function cmdGoal(e, t, n) {
   if (1 == t.length) return showGoalInfo(e);
   var o = t[1];
   if (goalOn && 2 == t.length && (!isNaN(parseInt(o)) || ["counter", "single", "multi", "init"].indexOf(o) >= 0)) return void sendTitle(e, lck + skp + sqr + "Non updatable parameter when Goal is running. " + skp + "(Only Description is updatable)." + skp + sqr + "Use " + qt("/goal off") + " to stop running the Goal.");
   if ("off" == o && 2 == t.length) return sendTitle(e, skp + lck + "Goal Feature is confirmed OFF."), goalOn = !1, goalReached = !1, row1 = "", row2 = "", row3 = "", cb.drawPanel(), cb.changeRoomSubject(""), showGoalInfo(e);
   if ("on" == o && 2 == t.length) return goalOn ? void sendTitle(e, skp + lck + "Goal is already ON (Running)." + skp) : runGoal(e);
   if ("init" == o && 2 == t.length) return setRemaining = cb.settings.setRemaining, goalMode = goalModeList[cb.settings.goalMode].mode, goalSubject = cb.settings.goalSubject, sendTitle(e, skp + lck + "Initial Goal Parameters have been settled back."), showGoalInfo(e);
   var a = parseInt(o);
   return 2 != t.length || isNaN(a) ? 2 == t.length && "counter" == o ? (goalMode = "COUNTER", sendTitle(e, skp + lck + 'Goal-Mode has been settled at "COUNTER".' + skp + sqr + "(Tips Counter : Goal-Amount will not be used.)"), showGoalInfo(e, 2)) : 2 == t.length && "single" == o ? (goalMode = "SINGLE", sendTitle(e, skp + lck + 'Goal-Mode has been settled at "SINGLE".'), showGoalInfo(e, 2)) : 2 == t.length && "multi" == o ? (goalMode = "MULTI", sendTitle(e, skp + lck + 'Goal-Mode has been settled at "MULTI".'), showGoalInfo(e, 2)) : ["on", "off", "single", "multi", "counter", "init"].indexOf(o) >= 0 ? "Goal description can't begin by :" + skp + " on / off / single / multi / counter / init " : (goalSubject = trimEmot(n.substring(5)), sendTitle(e, skp + lck + "New Goal-Description has been settled."), goalOn && !goalReached && changeSubject(), void showGoalInfo(e, 3)) : 0 >= a ? "Goal amount must be >0." + skp + ' (It will not be used in mode "COUNTER").' : (setRemaining = a, sendTitle(e, skp + lck + "New Goal-Amount has been settled."), showGoalInfo(e, 1))
}

function showGoalInfo(e, t) {
   var n = "";
   (setRemaining != cb.settings.setRemaining || goalMode != goalModeList[cb.settings.goalMode].mode || goalSubject != cb.settings.goalSubject) && (n = sqr + qt("/goal init") + " if you want to restaure initial settings." + skp);
   var o = xLine(7),
       a = skp + o + skp + lck + "Goal Parameters :" + skp,
       i = sy(1, t) + "Amount : " + qt("/goal <X>") + " : " + setRemaining + skp + sy(2, t) + "Mode : " + qt("/goal [ single / multi / counter ]") + " : " + goalMode + skp + sy(3, t) + "Goal is : " + qt("/goal <description>") + " : " + goalSubject + skp + sqr + "Run goal : " + qt("/goal [ on / off ]") + " : " + (goalOn ? "ON" : "OFF") + (goalReached ? " - (Goal Reached) " : "") + skp,
       l = (goalOn ? lck + "Goal is ON (Running)." + skp + sqr + "Description (only) is updatable." + skp + sqr + qt("/goal off") + " to stop running the goal." + skp : lck + "Goal is OFF " + (goalReached ? "(Goal Reached). " : ".") + skp + (goalReached ? sqr + "(" + qt("/goal off") + " if you want to clear the screen.)" + skp : "") + sqr + "All parameters are updatable." + skp + n + sqr + qt("/goal on") + " to run the Goal." + skp) + o + skp;
   sendTitle(e, a), sendNote(e, i), sendTitle(e, l)
}

function sy(e, t) {
   return e == t ? trg : sqr
}

function cmdSum(e) {
   if (0 == tipNb) return sendTitle(e, lck + "SUMMARY : No Tipper yet.");
   var t = xLine(5),
       n = elapsTime(startTime, "[hms]"),
       o = skp + t + skp + lck + appName + skp + t + skp + sqr + "RunningTime : " + n + skp + sqr + " SUMMARY (since the App Started) :",
       a = "" + dot + x(usrNb, "Tipper$ / ") + x(Math.round(tipSum / usrNb), "token$ by Tipper.") + skp + dot + "Highest Tipper : " + qt(maxSumUsr) + " : " + x(maxSum, "Token$.") + skp + dot + "Highest Tip : " + qt(maxTipUsr) + " : " + x(maxTip, "Token$."),
       i = "" + t + skp + sqr + "Total received : " + x(tipSum, "Token$.") + skp + t + skp + sqr + qt("/sum") + " to display a Summary again.";
   sendTitle(e, o), sendNote(e, a), sendTitle(e, i)
}

function cmdToken(e, t) {
   return 1 == t.length ? sendTitle(e, skp + lck + "Token Received Setting is : " + (tokenOn ? "ON" : "OFF") + skp + dot + qt("/token on") + " : Display the Total Tokens received in Panel." + skp + dot + qt("/token off") + " : Stop display the Total Tokens received." + skp) : "on" == t[1] ? tokenOn ? sendTitle(e, lck + "Token Received Display already ON") : (tokenOn = !0, sendTitle(e, lck + "Token Received Display settled ON."), void(goalOn && changePanel())) : "off" == t[1] ? tokenOn ? (tokenOn = !1, goalOn && changePanel(), void sendTitle(e, lck + "Token Received Display settled OFF.")) : sendTitle(e, lck + "Token Received Display already OFF") : "Format : " + qt("/token <on/off>")
}

function roomDisplay() {
   var e = 1;
   actionIndic >= minAction && (nextDisplay(), actionIndic = 0, e = noteNb && "LEVEL" == next ? 1 : minuteNb), cb.setTimeout(roomDisplay, 6e4 * e)
}

function nextDisplay() {
   "LEVEL" == next ? levelDisplay(all) : "NOTE" == next && noteDisplay(), nextIndex = nextIndex >= nextArray.length - 1 ? 0 : nextIndex + 1, next = nextArray[nextIndex]
}

function noteDisplay() {
   cycleNum = cycleNum >= noteNb ? 1 : cycleNum + 1, sendTitle(all, noteList[cycleNum].note)
}

function levelDisplay(e) {
   "LINE" == levelMode ? sendTitle(e, skp + levelTitle + " : " + levelNotice + skp) : sendTitle(e, skp + levelTitle + " : " + skp + levelNotice)
}

function cut(e) {
   return qt(e.substring(0, 25))
}

function watchCommand(e) {
   for (var t in cmdList) {
       var n = e.toLowerCase().indexOf(t);
       if (n >= 0) {
           var o = mySplit(e.substring(n));
           return e.substring(n).replace(o[0], cmdList[t].cmd)
       }
   }
}

function errorCmd(e, t, n) {
   sendTitle(e, skp + lck + " Error command : /" + n + skp + sqr + t + skp)
}

function onTest(e) {
   var t = e.indexOf("tip");
   if (-1 != t) {
       var n = mySplit(e.substring(t));
       if (3 == n.length) {
           var o = n[1],
               a = parseInt(n[2]);
           isNaN(a) || 0 >= a || onTip(o, a)
       }
   }
}



function isOwner(e) {
   return e == cb.room_slug
}

function sendTitle(e, t, n) {
   var o = n ? n : messColor;
   o = isOwner(e) ? "#000000" : o, cb.sendNotice(t, e, "", o, "bolder")
}

function sendNote(e, t, n) {
   var o = n ? n : messColor;
   cb.sendNotice(t, e, "", o, "normal")
}

function trimEmot(e) {
   e = e.replace(/\[/g, ""), e = e.replace(/\]/g, "");
   for (var t = mySplit(e), n = 0; n < t.length; n++) ":" == t[n][0] && t[n].length > 1 && (e = e.replace(t[n], ""));
   return e
}

function mySplit(e) {
   return e.trim().replace(/\s+/g, " ").split(" ")
}

function myRandom(e, t) {
   return Math.floor(e + Math.random() * (t - e + 1))
}

function elapsTime(e, t) {
   var n = (new Date).getTime();
   return toHms(n, e, t)
}

function toHms(e, t, n) {
   var o = (e - t) / 1e3,
       a = o / 86400;
   a = a >= 1 ? a - a % 1 : 0;
   var i = (o - 3600 * a * 24) / 3600;
   i -= i % 1;
   var l = o % 3600 / 60;
   l -= l % 1;
   var s = o % 3600 - 60 * l;
   s -= s % 1;
   var r = a > 0 ? x(a, "Day$ ") : "",
       c = 10 > i ? "0" + i : i,
       m = 10 > l ? "0" + l : l,
       u = 10 > s ? "0" + s : s,
       p = r + c + ":" + m + ":" + u,
       g = n;
   return g = g.replace("day", r), g = g.replace("hour", "00" == c ? "" : x(i, "hour$ ")), g = g.replace("minute", "00" == m ? "" : x(l, "minute$ ")), g = g.replace("seconde", "00" == u ? "" : s + " sec"), g = g.replace("hms", p), g.replace(/ /g, "") ? g : "00"
}

function xLine(e) {
   var t = "";
   for (e *= 5; e--;) t += lne;
   return t
}

function qt(e) {
   return ' "' + e + '"'
}

function x(e, t) {
   return e + " " + t.replace("$", e > 1 ? "s" : "")
}

function y(e, t) {
   return t.replace("$", e > 1 ? "s" : "")
}
var appName = " [ Geni Lovense ] ",
   owner = cb.room_slug,
   startTime = (new Date).getTime(),
   yr = 16436,
   mth = 5,
   messColor = "#6900CC",
   cbColor = "#DC5500",
   all = "",
   skp = "\n",
   dot = " \\u2981 ",
   hrt = " \\u2665 ",
   sqr = " \\u25A0 ",
   trg = " \\u25B6 ",
   lne = "\\u2500",
   lck = " :w__lck ",
   wht = " :w__wht ";
cb.settings_choices = [{
   name: "roomSubject",
   label: "1. ROOM SETTINGS ........ Room Subject",
   type: "str",
   minLength: 1,
   maxLength: 150,
   required: !0,
   defaultValue: "Lovense Lush : Device that vibrates longer at your tips and gives me pleasures"
}, {
   name: "tags",
   label: "Tags (#) ",
   type: "str",
   minLength: 1,
   maxLength: 120,
   required: !1,
   defaultValue: "Lovense"
}, {
   name: "tokenOn",
   label: "Tokens",
   type: "choice",
   choice1: 'Display "Total Received" in Panel',
   choice2: "Not displayed",
   "default": 'Display "Total Received" in Panel'
}, {
   name: "messColor",
   label: "2. NOTICES SETTINGS ... - Display Color",
   type: "choice",
   choice1: "Orange",
   choice2: "Blue",
   choice3: "Purple",
   choice4: "Pink",
   choice5: "Dark_Red",
   choice6: "Black",
   defaultValue: "Dark_Red"
}, {
   name: "minuteNb",
   label: " (minutes) - Display Time ",
   type: "int",
   minValue: 1,
   maxValue: 30,
   defaultValue: 1
}, {
   name: "levelMode",
   label: "- Notification of Lovense-Levels",
   type: "choice",
   choice1: "NO (next info will not be used)",
   choice2: "YES - Mode List",
   choice3: "YES - Single Line",
   defaultValue: "YES - Mode List"
}, {
   name: "levelTitle",
   label: "Level Title",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !0,
   defaultValue: "MY LOVENSE LUSH VIBRATOR IS SET TO REACT TO YOUR TIPS. THERE ARE 5 LEVELS OF INTENSITY OR RANDOMLY CHOOSE A LEVEL FROM 1-5 "
}, {
   name: "level1",
   label: "Level 1 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !1,
   defaultValue: "Level 1 - Tip (1-14) 3 seconds (Low vibrations)"
}, {
   name: "level2",
   label: "Level 2 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !1,
   defaultValue: "Level 2 - Tip (15-99) 6 seconds (Medium vibrations)"
}, {
   name: "level3",
   label: "Level 3 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !1,
   defaultValue: "Level 3 - Tip (100-499) 10 seconds (Medium vibrations)"
}, {
   name: "level4",
   label: "Level 4 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !1,
   defaultValue: "Level 4 - Tip (500-999) 1 Minute (High vibrations)"
}, {
   name: "level5",
   label: "Level 5 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !1,
   defaultValue: "Level 5 - Tip (1000 - 1000+) 3 Minutes (High vibrations)"
}, {
   name: "RandomLevel",
   label: "Random Level ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !1,
   defaultValue: "Random Lvl - Tip (200) To get a random level!"
}, {
   name: "notice1",
   label: "- Optional Additional ...... Notice 1 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !1,
   defaultValue: "Lovense Lush : Device that vibrates longer on your Tips!"
}, {
   name: "notice2",
   label: "Notice 2 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !1,
   defaultValue:" :Lovense Lush Give me pleasure with your tips!"
}, {
   name: "notice3",
   label: "Notice 3 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
   required: !1,
   defaultValue: " : Lovense info \n Give me pleasure with your tips!!!"

}, {    name: 'Auto1',
   type: 'choice',
   choice1: 'yes',
   choice2: 'no',
   defaultValue: 'no',
   label: "Auto thank you active with tips? (notices have different colors)"
},{
   name: "Thanks15",
   label: "Thank you for 15 to 99 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
       defaultValue: "I love it, thank you!!"
}, {
   name: "Thanks100",
   label: "Thank you for 100 to 499 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
       defaultValue: "You know how to make me happy! Thank you!!"
}, {
   name: "Thanks500",
   label: "Thank you for 500 to 999 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
       defaultValue: "Thank you so much for giving me this pleasure!!"
}, {
   name: "Thanks1000",
   label: "Thank you for 1000+ ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
       defaultValue: "OMG!!! I love it!! THANK YOU SO MUCH!! "
}, {
   name: "Thanks200",
   label: "Thank you for 200 ",
   type: "str",
   minLength: 0,
   maxLength: 10240,
       defaultValue: "Thank you for the random lvl suprise!! "
}, {




   name: "goalMode",
   label: "3. GOAL SETTINGS - Will you use a Goal",
   type: "choice",
   choice1: "NO (next info will not be used)",
   choice2: "Single Goal",
   choice3: "Multi Goals (Repeated)",
   "default": "NO (next info will not be used)"
}, {
   name: "goalSubject",
   label: "Goal is ....",
   type: "str",
   minLength: 1,
   maxLength: 200,
   required: !0,
   defaultValue: "A surprise"
}, {
   name: "setRemaining",
   label: "Amount",
   type: "int",
   minValue: 0,
   maxValue: 9999999,
   defaultValue: 2e3
}];
var minuteNb = parseInt(cb.settings.minuteNb),
   minAction = 5,
   actionIndic = minAction,
   cycleNum = 0,
   nextArray = ["LEVEL", "NOTE"],
   nextIndex = 0,
   next = "",
   roomSubject = cb.settings.roomSubject,
   levelTitle = "",
   maxLevel = 6,
   levelMode = "",
   levelNotice = "",
   levelModeList = {};
levelModeList["NO (next info will not be used)"] = {
   level: ""
}, levelModeList["YES - Mode List"] = {
   level: "LIST"
}, levelModeList["YES - Single Line"] = {
   level: "LINE"
};
var maxNotice = 3,
   noteList = {},
   noteNb = 0,
   tipSum = 0,
   tipNb = 0,
   lastTipper = "",
   lastTip = 0,
   mvpName = "",
   mvpSum = 0,
   userList = {},
   higherTip = 0,
   higherTipName = "",
   totalList = {},
   usrNb = 0,
   maxSum = 0,
   maxSumUsr = "",
   maxTip = 0,
   maxTipUsr = "",
   Auto1 = cb.settings.Auto1,
   Thanks15 = cb.settings.Thanks15,
   Thanks100 = cb.settings.Thanks100,
   Thanks500 = cb.settings.Thanks500,
   Thanks1000 = cb.settings.Thanks1000,

   tokenOn = "Not displayed" == cb.settings.tokenOn ? !1 : !0,
   goalMode = "",
   goalSubject = cb.settings.goalSubject,
   setRemaining = parseInt(cb.settings.setRemaining),
   goalOn = !0,
   goalReached = !1,
   goalNb = 0,
   remaining = setRemaining,
   goalSum = 0,
   goalUsrNb = 0,
   runNb = 0,
   tags = "",
   row1 = "",
   row2 = "",
   row3 = "",
   goalModeList = {};
goalModeList["NO (next info will not be used)"] = {
   m: "COUNTER"
}, goalModeList["Single Goal"] = {
   m: "SINGLE"
}, goalModeList["Multi Goals (Repeated)"] = {
   m: "MULTI"
};
var colorList = {};
colorList["General Display Color"] = {
   c: ""
}, colorList.Orange = {
   c: "#DC5500"
}, colorList.Blue = {
   c: "#6900CC"
}, colorList.Purple = {
   c: "#323F75"
}, colorList.Pink = {
   c: "#FA5858"
}, colorList.Dark_Red = {
   c: "#9F000F"
}, colorList.Black = {
   c: "#000000"
};
var cmdList = {};
cmdList["/goa"] = {
   cmd: "goal"
}, cmdList["!goa"] = {
   cmd: "goal"
}, cmdList["/sum"] = {
   cmd: "sum"
}, cmdList["!sum"] = {
   cmd: "sum"
}, cmdList["/tok"] = {
   cmd: "token"
}, cmdList["!tok"] = {
   cmd: "token"
}, cb.onEnter(function(e) {
   var t = e.user;
   isOwner(t) || levelMode && levelDisplay(t)
}), cb.onMessage(function(e) {
   {
       var t = e.user,
           n = e.m,
           o = e.is_mod;
       !e.has_tokens
   }
   if (e.hasOwnProperty("X-Spam") && e["X-Spam"]) return e;
   if (isOwner("geni_xxx") && onTest(e.m), isOwner) {
       var a = watchCommand(n);
       if (a) {
           var i = doCommand(t, a, o);
           i && errorCmd(t, i, a), e.m = "", e["X-Spam"] = !0
       }
   }
   actionIndic += 1
}),

cb.onTip(function(e) {
   var t = parseInt(e.amount),
       n = e.from_user;
   onTip(n, t);
 if (cb.settings.Auto1 == 'yes'){
  if (e['amount'] >14 && e['amount']<100) {
           cb.chatNotice(Thanks15, "", '#FFFFFF', '#00FFFF', 'bold');
        }
       if (e['amount'] >99 && e['amount']<500) {
           cb.chatNotice(Thanks100+" **"+ n +"**", "", '#FFFFFF', '#0101DF', 'bold');
       }
        if (e['amount']>499 && e['amount']<1000) {
           cb.chatNotice(Thanks500+" ***"+ n +"***", "",  '#FFFFFF', '#FF0000', 'bold');
       }
       if (e['amount']>999) {
           cb.chatNotice(Thanks1000+" *****"+ n +"*****", "", '#FFFFFF', '#FA58F4', 'bold');    
}
}
 
}),
var backgroundImage = '38cdfc12-0d1a-4346-a2d5-53406072b7d0';
var tips = row1;
var highest = row2;
var last = row3;
var fontSize = 11;

cb.onDrawPanel(function(user) {
 return {
     "template": "image_template",
     "layers": [
         {'type': 'image', 'fileID': backgroundImage},
         {
             'type': 'text',
             'text': row1,
             'top': 6,
             'left': 30,
             'font-size': 12,
             //'text-align': 'center',
             'font-weight': 'bold',
              'color': 'black',
         },
         {
           'type': 'text',
           'text': row2,
           'top': 29,
           'left': 30,
           'font-size': 11,
          // 'text-align': 'center',
           //'font-weight': 'bold',
            'color': 'black',
        },
         {
            'type': 'text',
            'text': row3,
            'top': 51,
            'left': 30,
           'font-size': 11,
           // 'text-align': 'center',
           //'font-weight': 'bold',
            'color': 'black',
         },
     ],
   };
});
cb.drawPanel();
init();
Responder

#20

0
(01-02-2019, 11:00 PM)PSB escribió: Silici0, gracias por tus explicaciones ya que son de mucha utilidad. Bueno por otro lado yo tambien he creado mis propias apps y me encantaría saber como se realiza la ofuscacion de los codigos, ya que me gustaria proteger estos codigos.

De antemano agradezco tu porptuna guia y colaboracion.

Que tengas un escelente día!

Si buscas "ofuscate javascript" verás que tienes un montón de servicios online que hacen su función perfectamente. En un mundo ideal nadie tendría que ocultar su código porque todo el mundo sería respetuoso y pondría de quien es el código que está copiando o le pediría permiso. Pero como la gente es como es pues toca ofuscarlo y dejar de aprender unos de otros.

(01-06-2019, 11:17 PM)jcstudios escribió: ['Pero porque se podria dar que sale un error que no permite guardar la app, dice que es un error de java con el chat!

Si mientras guardas la aplicación tienes abierta la ventana de emitir los mensajes de error te aparecen en el chat. Es muy útil para saber que está pasando en el código.
[Imagen: recruitment_468x60_01.gif]
Responder

¿Te gustó esta entrada? ¡Compártela en tus redes!:




Usuarios navegando en este tema:
1 invitado(s)