Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Buy OSRS Gold


Starfox's String Util

Recommended Posts

This is a helper class I wrote that helps you manipulate and generate strings in java.


import java.awt.Graphics;import java.math.RoundingMode;import java.text.DecimalFormat;import java.text.NumberFormat;import java.util.Locale;/** * The Strings class is an extension of utility methods contained within the String class. * <p> * * @author Nolan */public class Strings {    /**     * A constant representing one thousand (1,000).     */    private static final int K = 1000;    /**     * A constant representing one million (1,000,000).     */    private static final int M = 1000000;    /**     * A constant representing one billion (1,000,000,000).     */    private static final int B = 1000000000;    /**     * Capitalizes the first letter of the specified string.     * <p>     *     * @param string The string.     * @[member=Return] The string with the capital first letter.     * Returns the original string if it has a length of 0 or less.     */    public static String capitalizeFirst(String string) {        if (string.length() < 1) {            return string;        }        return string.replaceFirst(string.substring(0, 1), string.substring(0, 1).toUpperCase());    }    /**     * Replaces any underscores in the specified string with spaces.     * <p>     *     * @param string The string.     * @[member=Return] A string that has its underscores replaced with spaces.     */    public static String replaceUnderscores(String string) {        return string.replaceAll("_", " ");    }    /**     * Formats the specified string for an enum toString.     * <p>     *     * @param enumName The name of the enum.     * @[member=Return] The formatted string.     */    public static String enumToString(String enumName) {        return capitalizeFirst(replaceUnderscores(enumName.toLowerCase()));    }    /**     * Gets the length of the specified string in pixels.     * <p>     *     * @param g The graphics used to draw the string.     * @param s The string.     * @[member=Return] The length.     */    public static int getStringPixelLength(Graphics g, String s) {        return g.getFontMetrics().stringWidth(s);    }    /**     * Inserts commas (US LOCALE) into the specified integer.     * <p>     *     * @param number The integer to insert commas into.     * @[member=Return] A string representing the specified integer with commas inserted.     */    public static String commas(int number) {        return commas((long) number);    }    /**     * Inserts commas (US LOCALE) into the specified double.     * <p>     *     * @param number The double to insert commas into.     * @[member=Return] A string representing the specified double with commas inserted.     */    public static String commas(double number) {        return commas((long) number);    }    /**     * Inserts commas (US LOCALE) into the specified long.     * <p>     *     * @param number The long to insert commas into.     * @[member=Return] A string representing the specified long with commas inserted.     */    public static String commas(long number) {        return NumberFormat.getNumberInstance(Locale.US).format(number);    }    /**     * Formats a number to be in KMB format.     * <p>     *     * @param number    The number.     * @param upperCase True to display the string in upper case, false for lower case.     * @[member=Return] A KMB formatted string representing the number.     * @[member=see] #kmb(long, boolean)     */    public static String kmb(int number, boolean upperCase) {        return kmb((long) number, upperCase);    }    /**     * Formats a number to be in KMB format.     * <p>     *     * @param number    The number.     * @param upperCase True to display the string in upper case, false for lower case.     * @[member=Return] A KMB formatted string representing the number.     * @[member=see] #kmb(long, boolean)     */    public static String kmb(double number, boolean upperCase) {        return kmb((long) number, upperCase);    }    /**     * Formats a number to be in KMB format.     * <p>     * KMB format is as follows:     * <ul>     * <li>Any number between 0 and 999 is represented as such.</li>     * <li>Any number between 1000 and 999999 is represented with a 'k' replacing the last trailing digit of the number. e.g. 52250 would be represented as     * 52.25k.</li>     * <li>Any number between 1000000 and 999999999 is represented with a 'm' replacing the last four trailing digits of the number. e.g. 1220000 would be     * represented as 1.22m.</li>     * <li>Any number above 1000000000 is represented with a 'b' replacing the last seven trailing digits of the number. e.e. 1220000000 would be represented as     * 1.22b</li>     * </ul>     * <p>     * All negative numbers are treated the same as positive numbers.     * <p>     *     * @param number    The number.     * @param upperCase True to display the string in upper case, false for lower case.     * @[member=Return] A KMB formatted string representing the number.     */    public static String kmb(long number, boolean upperCase) {        DecimalFormat df = new DecimalFormat("#.##");        df.setRoundingMode(RoundingMode.DOWN);        df.setMinimumFractionDigits(2);        if (Math.abs(number) < K) {            return "" + number;        } else if (Math.abs(number) < M) {            double num = (double) number / (double) K;            return "" + df.format(num) + (upperCase ? "K" : "k");        } else if (Math.abs(number) <  {            double num = (double) number / (double) M;            return "" + df.format(num) + (upperCase ? "M" : "m");        }        double num = (double) number / (double) B;        return "" + df.format(num) + (upperCase ? "B" : "b");    }    /**     * Formats a number to be in a readable time format. The number inputted should be in milliseconds.     * <p>     * The format returned is DD:HH:MM:SS. Milliseconds are truncated and not included in the formatted display.     * <p>     * All negative numbers are treated the same as positive numbers.     * <p>     *     * @param milliseconds The time being formatted, in milliseconds.     * @[member=Return] A KMB formatted string representing the number.     */    public static String timeFormat(long milliseconds) {        long seconds = milliseconds / 1000;        long minutes = seconds / 60;        seconds %= 60;        long hours = minutes / 60;        minutes %= 60;        long days = hours / 24;        hours %= 24;        String formatted = "";        String dayString = "" + days;        if (dayString.length() == 1) {            dayString = "0" + dayString;        }        formatted += dayString + ":";        String hourString = "" + hours;        if (hourString.length() == 1) {            hourString = "0" + hourString;        }        formatted += hourString + ":";        String minuteString = "" + minutes;        if (minuteString.length() == 1) {            minuteString = "0" + minuteString;        }        formatted += minuteString + ":";        String secondString = "" + seconds;        if (secondString.length() == 1) {            secondString = "0" + secondString;        }        formatted += secondString;        return formatted;    }    /**     * Formats the specified amount of time in milliseconds to a readable format.     * <p>     *     * @param ms        The amount of time in milliseconds.     * @param upperCase True to display the string in upper case, false for lower case.     * @[member=Return] A formatted version of the time specified.     */    public static String msToString(long ms, boolean upperCase) {        String msString = "";        long seconds = ms / 1000;        long minutes = seconds / 60;        seconds %= 60;        long hours = minutes / 60;        minutes %= 60;        long days = hours / 24;        hours %= 24;        if (days >= 1) {            msString += days + (days > 1 ? " " + (upperCase ? "D" : "d") + "ays, " : " " + (upperCase ? "D" : "d") + "ay, ");        }        if (hours >= 1) {            msString += hours + (hours > 1 ? " " + (upperCase ? "H" : "h") + "ours, " : " " + (upperCase ? "H" : "h") + "our, ");        }        if (minutes >= 1) {            msString += minutes + (minutes > 1 ? " " + (upperCase ? "M" : "m") + "inutes, " : " " + (upperCase ? "M" : "m") + "inute, ");        }        msString += seconds + (seconds > 1 || seconds == 0 ? " " + (upperCase ? "S" : "s") + "econds" : " " + (upperCase ? "S" : "s") + "econd");        return msString;    }    /**     * Inserts non-breaking spaces in place of breaking spaces in the specified RSN.     * <p>     *     * @param rsn The RSN to fix.     * @[member=Return] The fixed RSN.     */    public static String fixRSN(String rsn) {        return rsn != null ? rsn.replaceAll(" ", " ") : null;    }    /**     * Inserts breaking spaces in place of non-breaking spacing in the specified RSN.     * <p>     *     * @param rsn The RSN to reverse.     * @[member=Return] The reversed RSN.     */    public static String reverseRSN(String rsn) {        return rsn != null ? rsn.replaceAll(" ", " ") : null;    }    /**     * Gets the enum matching the specified string.     * <p>     *     * @param <T>    Enum type.     * @param c      The enum class type.     * @param string The string to match.     * @[member=Return] The corresponding enum.     * Null if no enum is found matching the string.     */    public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string) {        if (c != null && string != null) {            try {                return Enum.valueOf(c, string.trim().toUpperCase());            } catch (IllegalArgumentException ex) {                ex.printStackTrace();            }        }        return null;    }}
  • Like 4

Share this post

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Similar Content

    • By sslippi
      I want to start by saying I'm new to programming.
      I'm trying to make a basic script that completes Druidic Ritual. I'm trying to withdraw all of the quest items and teleports needed with Banking.withdraw().
      Like this:
      Banking.withdraw(0, 2138, 2136, 2132, 2134, 8007, 3853); I'm wanting to avoid adding a static wait just so I can get good practice with implementing anti-ban. How would I go about making this method not spam click the items when trying to withdraw them?
    • By notsmile
      So I wanted to make a GUI for my Runecrafter and use TitledBorders instead of using tabs since it looks nicer imo.
      I can't seem to get the TitledBorder to appear fully (I think that's the problem anyway) properly in the GUI.
      It looks like this:
      Here is the code for it:
      JPanel runesPanel = new JPanel(); runesPanel.setBackground(Color.DARK_GRAY); TitledBorder runesBorder = BorderFactory.createTitledBorder("Runes"); runesBorder.setTitleColor(Color.lightGray); runesBorder.setTitleJustification(TitledBorder.LEFT); runesPanel.setBorder(runesBorder); JComboBox<String> runeOptions = new JComboBox<String>(new String[] { "Select Runes", "Air", "Astral*", "Blood*", "Cosmic", "Earth", "Fire", "Law", "Mud", "Nature", "Soul*", "Water", "Wrath*", "ZMI*"}); runesPanel.setBounds(20,20,200,200); runesPanel.add(runeOptions); mainGuiSettingsPanel.add(runesPanel); mainGuiFrame.setVisible(true); } }  
      Sorry for the nooby question, new to using Swing and Java
    • By jerrycan314
      when i open a tribot client it crashes and i get this error :c

      # A fatal error has been detected by the Java Runtime Environment:
      #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7a0e3d9d, pid=1608, tid=0x00000e54
      # JRE version: Java(TM) SE Runtime Environment (8.0_251-b08) (build 1.8.0_251-b08)
      # Java VM: Java HotSpot(TM) Client VM (25.251-b08 mixed mode windows-x86 )
      # Problematic frame:
      # C  [atiglpxx.dll+0x3d9d]
    • By Heroinkid
      Hi I got a proxy server from Virmach. I cannot seem to get Tribot to connect to it. I have gotten a 3rd party internet browser called Maxthus to get it to work so I don't think that its the server that's not working. Yes I have VIP-E as well. Please help thanks!

    • By briareos2285
      Just got a new Windows 10 Home x64 Laptop. Going through my usual install method and finding that I cant get looking glass to work. I have followed a few "old" guides, because I cant find any that are more recent. I am installing Java SE Development Kit 8u251, I am choosing the x86 version since the only OSbuddy cross platform .jar  file is 32bit. Its worked fine in the past. I then open Osbuddy, and then Open Tribot. I leave it on the default Tribot Version of 10.24.1. I select the java version for Tribot to use to be the JDK and not the jre. I changed the Heap Size to 1024 MB and login. I minimize Osbuddy, then I click New Client(Looking Glass). The Screen goes to black and says " Waiting for a Runescape client.... currently waiting for a valid client. List of detected java applications below." and there is nothing Below. I also tried a backup method that used to work as well, which was to instead click New Client (Osbuddy) and then manually select the Osbuddy .jar file which would open up Osbuddy and Create a Looking Glass Tab that mirrored Osbuddy. This no longer happens either. Ive also deleted the Hooks and Caches using Naton's Java Executable. I have also defined the correct Paths in my Computers Environment Variables.
      Im at a loss for what to do. Any help greatly appreciated
    • By QNDLF
      Has been fine for the past few days however doesn't work today, have deleted the full .jar file and redownloaded again and it has the same problem
      Any ideas how to fix it? 

    • By Sidesteppin12
      I decided to create my own banking API that mimics tribots way of implementing the API as much as possible. Basically it would only contain nothing more than just method calls. Simple and easy to use.
      This API is a reworked version that is currently in my jHerblore script. I intend to release my GE api as well once I have finished that one up too. The API requires DaxWalker & Wastedbro's Item Price API. Other than that the rest is achieveable with standard dependencies that already comes with tribot.
      All of the method names are the same as the ones from Banking & GrandExchange class in tribot, with a few exceptions, the only difference is that these methods are called with different class names such as Banker & Exchanger, so they do not collide with the Banking & GrandExchange class of tribot and cause an ambiguity problem.
      List of available methods:
      Some of the features this API offers:
      - Methods that incorporate any form of withdrawing or depositing do not need you to first check if the bank is open nor if it is loaded. It will attempt to open the bank if it is not open before returning false, and wait for bank to load if it is not loaded yet.
      - Methods that incorporate any form of buying or selling do not need you to first check if the exchange window is open. It will attempt to open the exchange window if it is not open before returning false.
      - Deselector. All methods that require the mouse to click somewhere on the screen first check if an item or spell is selected, if it is then it will deselect whatever is selected before attempting the requested action.
      - Additional failsafes, not just the deselector. Tribots banking api does not know if what you were trying to click actually was succesfully clicked. Instead it views succesfully calling the click function as a succesfull attempt. It's kind of like playing pin the nail to the donkey game. It does not know if it pinned it at the right location, but as long as it pinned it the function returns true. This is not true for all methods, some methods do actually check if the action was succesfully performed, however they do not reattempt the action if it failed. 1 call = 1 attempt. My api will reattempt any action that might fail, several times, before returning false and will also wait until inventory count is updated. For example using the tribot banking API if you were to deposit all your items and then immediately check your available inventory space before withdrawing items then it might not work as you wish because Banker.depositAll() returns before the action of depositing has finished.
      - When banking, closes GrandExchange window if it is open.
      - When buying/selling, closes the bank screen if it is open.
      - Support for withdrawing items in noted format and with or without stack exception. Stack exception is basically if you wish to draw X amount of items in your inventory but you only had Y left, then you can choose if you wish to draw these items or not. Also supports depositing of noted item ids if you happen to pass a list with of items that contains items of unnoted item ids, but the item in your inventory is a noted version of the item in your inventory. Also will not deposit equipment or items if you have none equipped or in your inventory. There is a total of 4 different depositing methods and 16 different withdrawing methods.
      - Unique dynamic sleeping method, all methods that should sleep already have sleeps implemented so you do not need to call a sleep after executing any of the methods. Involves random varying sleeps but will occasionally, every so often, in a irregular pattern, sleep a bit longer. I use this because I prefer it over General.sleep(). Feel free to replace it with whichever method you wish. Remember before running the main loop in your script to call:
      jGeneral.get().generateSeed(); This will create a random number between 0-100 that will be added to your dynamic sleeps in milliseconds. This is so no bot has the same average reaction/sleeping time.
      - When buying items on the GE, if the bot does not have any money or too little money in the inventory, it will check if you have enough of the missing amount in the bank and withdraw that amount.
      - Custom buying method that checks for an exact string match of the item you wish to buy and chooses that one from the returned items in the buy window search box. The standard GE api does not do this and will for instance click the wrong herb when it searches for "Guam leaf" in the grand exhcange, this is because more than one item contains "guam leaf" in their name. Such as Grimy guam leaf and so on.
      - Profit tracking when buying/selling items on the GE. This is optional.
      - Pushed new updates that fix some of the methods that I've tested a bit for now, bit of logic and efficiency improvements. Also added 2 new depositing methods. Remember to replace the old java files with the new ones.
      - Pushed even more updates. Fixed interface problem for withdrawing noted items. My GE api is now also been released to the public. Enjoy!
    • By tomking50
      I've just purchased this bot and im wondering how do i set breaks to avoid bans?
      Thank you,   
    • By will6100
      I really love the process of developing a script, testing it, debugging it, etc.. So after writing my first really simple script that would tan hides, I got my first botting account banned, which is something I knew was gonna happen since my lack of scripting knowledge. Im ready to get a new one up and going and continue to develop more basic scripts to sharpen my scripting skills. Im sharing my first script here and looking to hear what I should do and should not do. Also get some tips on what to look for to reduce the banning rates of my testing accounts. The account I was using was only combat lvl 5 and didnt have any quests done, I guess that didnt help too? I was also about to introduce ABC2 into the script and learn how to use it but my account got banned right before I could implement it. So looking forward to hear your criticisms about my script and tips to not get the script bannable. Also have in mind I didnt really refactor anything, some parts may look ugly, beware!
      package scripts; import org.tribot.api.DynamicClicking; import org.tribot.api.General; import org.tribot.api.Timing; import org.tribot.api.input.Mouse; import org.tribot.api2007.*; import org.tribot.api2007.types.RSNPC; import org.tribot.api2007.types.RSObject; import org.tribot.api2007.types.RSTile; import org.tribot.api2007.util.ThreadSettings; import org.tribot.script.Script; import org.tribot.script.ScriptManifest; import java.awt.*; import java.util.function.BooleanSupplier; @ScriptManifest(category = "Moneymaking", authors = "will6100" , name = "Tanner") public class Tanner extends Script { private final static int BLACK_DHIDE_ID = 1747; private final static int TANNED_LEATHER_ID = 2509; private final static int ELLIS_ID = 3231; private final static int BANK_BOOTH_ID = 10355; private final static int COINS_ID = 995; private boolean isBankable() { RSObject[] booths = Objects.findNearest(100, BANK_BOOTH_ID); if (booths.length > 1) { return booths[0].isOnScreen(); } return false; } private boolean coinsCheck() { if (Inventory.find(COINS_ID).length < 1) { if (Banking.find(COINS_ID).length > 0) { if (!Inventory.isFull()) { return Banking.withdraw(0, COINS_ID); } else { if (Inventory.find(BLACK_DHIDE_ID).length > 0) { return Banking.deposit(1, BLACK_DHIDE_ID); } else if (Inventory.find(TANNED_LEATHER_ID).length > 0){ return Banking.depositAll() > 0; } } } } else { return true; } return false; } private boolean bank() { if (!openBank()) { General.println("Couldnt open bank"); return false; } if (!coinsCheck()) { General.println("No more gold"); return false; } if (!setupInventory()) { General.println("No more hides"); return false; } sleep(100,1000); return true; } private boolean setupInventory() { if (Inventory.find(TANNED_LEATHER_ID).length > 0) { sleep(50,1000); if (Banking.deposit(0,TANNED_LEATHER_ID)) { if (Banking.find(BLACK_DHIDE_ID).length > 0){ sleep(50,1000); Banking.withdraw(0, BLACK_DHIDE_ID); return Timing.waitCondition(this::readyToTan, General.random(3000,5000)); } } } else if (Inventory.find(TANNED_LEATHER_ID).length < 1) { sleep(50,1000); if (Banking.find(BLACK_DHIDE_ID).length > 0){ Banking.withdraw(0, BLACK_DHIDE_ID); return Timing.waitCondition(this::readyToTan, General.random(3000,5000)); } } return false; } private boolean openBank() { if (!Banking.isBankScreenOpen()) { if (!isBankable()){ if(!walkToDestCondition(this::isBankable)) { return false; } } return clickBankBooth(); } return true; } private boolean clickBankBooth() { RSObject[] bankBooths = Objects.findNearest(40, BANK_BOOTH_ID); RSObject booth; if(bankBooths.length > 1) { do { sleep(50); booth = bankBooths[General.random(0, bankBooths.length - 2)]; } while (!booth.isOnScreen() && !booth.isClickable()); booth.hover(); if (isHoverRendered(Mouse.getPos())){ Mouse.click(1); }else { clickBankBooth(); } return Timing.waitCondition(Banking::isBankScreenOpen, General.random(25000,27000)); } return false; } private boolean isHoverRendered (Point toHover) { return !Screen.getColorAt(Mouse.getPos()).equals(new Color(0, 0, 0)); } private boolean isTannable() { RSNPC[] ellis = NPCs.find(ELLIS_ID); if (ellis.length < 1) { return false; } else if (isTanningWindowOpen()){ return true; } return ellis[0].isOnScreen(); } private boolean tanLeather() { RSNPC ellis; if (isTannable()) { sleep(100,200); ellis = NPCs.find(ELLIS_ID)[0]; while (!isTanningWindowOpen()) { Mouse.setSpeed(190); sleep(300,500); if (DynamicClicking.clickRSNPC(ellis,"Trade " + ellis.getName())){ Mouse.setSpeed(115); Timing.waitCondition(this::isTanningWindowOpen, General.random(15000, 17000)); sleep(200,500); Interfaces.get(324,107).click("Tan all"); return Timing.waitCondition(() -> !isTanningWindowOpen(), General.random(3000,5000)); } } } else { return walkToDestCondition(this::isTannable); } return false; } private boolean walkToDestCondition(BooleanSupplier waitCondition) { Walking.blindWalkTo(new RSTile(3278 + General.random(-2,2), 3180 + General.random(-1, 1))); return Timing.waitCondition(waitCondition, General.random(11000,12000)); } private boolean isTanningWindowOpen() { return Interfaces.isInterfaceValid(324); } private boolean readyToTan() { return Inventory.find(BLACK_DHIDE_ID).length > 0 && Inventory.find(COINS_ID).length > 0 ; } @Override public void run() { Mouse.setSpeed(115); ThreadSettings ts = new ThreadSettings(); ts.setClickingAPIUseDynamic(true); while (true) { sleep(50); if (isTannable()) { if (readyToTan()) { if(!tanLeather()){ General.println("1"); break; } } else { if(!bank()) { General.println("2"); break; } } } else if (isBankable()) { if (readyToTan()) { if(!tanLeather()){ General.println("3"); break; } } else { if(!bank()) { General.println("4"); break; } } } else if (readyToTan()) { if(!tanLeather()){ General.println("5"); break; } } else { if(!bank()) { General.println("6"); break; } } } } }  
    • By schenkelenkel
      Getting this error, client won't start.

  • Our picks

    • Gradle is a build tool used to accelerate developer productivity.

      We recently setup a Maven repository (TRiBot Central) to make it easier for scripters to create scripts. Check it out here: https://gitlab.com/trilez-software/tribot/tribot-central/-/packages

      Furthermore, we've released a simple Gradle project to make it easy to run TRiBot and develop scripts for it. Check it out here: https://gitlab.com/trilez-software/tribot/tribot-gradle-launcher

      The goals of TRiBot Central are to:

      Deliver updates to TRiBot faster

      Better organize TRiBot's dependencies (AKA dependancies)

      Make it easier to develop scripts for TRiBot

      Make it easier to use and run TRiBot

      Note: TRiBot won't be able to run scripts from within this project until TRiBot's next release.
        • Like
      • 8 replies
    • Hi everyone,

      I'd like to thank everyone for their patience in this transition period. Since last week, we've worked out the remaining bugs with this integration.

      Some users have still been having issues with connecting their forums account to their Auth0 account. To resolve this, we've imported all forums accounts into Auth0.

      Unfortunately, the accounts which were imported today were using an unsupported password hashing algorithm. Hence, random passwords were set during the import.

      What does this mean for me?

      If you've previously linked your forums account to your Auth0 account, you don't have to do anything. Nothing changes for you.

      If you haven't logged in via our new login yet,

      Try logging in with your forums email address and the last password you used

      If you are unable to login, please use the "Forgot password" tool on the login page:
      Follow the instructions to reset your password
        • thonking
        • Like
      • 13 replies
    • Hello everyone,

      Last week we tried to roll out Auth0 Login, but we lost that battle. Now it's time to win the war!

      Important changes

      When logging into the client, you'll now have to enter your Auth0 account credentials instead of your forums credentials

      Note: 2FA is still handled through your forums account (for the time being)

      Changes for existing users

      You'll have to link your Auth0 account to your forums account here: https://tribot.org/forums/settings/login/?service=11

      Auth0 accounts have been created for most existing users. Please use your forums email address and password to login.

      Important notes

      Make sure to verify your email address upon creating a new Auth0 account

      When we mention your Auth0 account, we mean your account used for auth.tribot.org as displayed below
      • 81 replies
    • To better support the upcoming changes (TRiBot X, new repository), we're switching our login handler to Auth0. Instead of logging in with the standard form, you'll now be required to login through our Auth0 application.

      All existing accounts which have been used within approximately the past year have been imported into Auth0 using the same email and password combination which has been stored on the forums.

      What does this mean for users?

      Your account credentials are now even more securely stored

      You'll be able to login via Facebook, Google, and others in the future

      Is there anything users have to do differently now?

      Existing users: You'll have to login with the standard login, open your Account Settings, then link your Auth0 account

      New users: You'll be redirected to our Auth0 app (auth.tribot.org) where you'll be able to create an account

      Why was this change made?

      The new apps we are creating (such as the new repository) aren't able to use the forums to handle user logins

      To centralize all user accounts in one area

      To ensure that the client login doesn't go down when the forums are having problems

      To speed up our development

      Other considerations

      There's no documentation or official support for using Invision Community combined with Auth0, so there are still a few kinks we're working out

      We're in the works of creating an account management panel specifically for Auth0 accounts (ETA August)

      It's not possible to change email addresses for the time being (this will be resolved this August)

      Changing passwords is a weird process for the time being. To change your password, you'll have to use the "Don't remember your password" tool on the Auth0 login page
        • Like
      • 11 replies
    • Over the past month, we've been working hard on TRiBot's new repository - a much needed update. This change has been deemed necessary for TRiBot X, and will allow us to really speed up development of all aspects of TRiBot.

      Today we are going to share what we've been working on!

      Now you must be wondering what kind of features the new repository will have.... well, you'll have to be patient for a little while longer. We're still figuring out various technical aspects so we can't provide answers to all possible questions. We're also focusing on development rather than writing about it so that everyone can get access to our latest developments at lightning speed. I will however answer a few users' questions.

      We're planning on a release of this early to mid August, giving users some goodies before TRiBot X's release.

      Thank you all for being patient. I hope everyone is excited as much as I am!
        • Like
      • 17 replies
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Create New...