├── README.md ├── eboot.bin ├── param.sfo ├── resources ├── ICON0.PNG ├── PARAM.SFO ├── back.png ├── buttons.png └── functions.lua ├── sce_sys ├── icon0.png ├── livearea │ └── contents │ │ ├── bg0.png │ │ ├── frame_icon.png │ │ ├── startup.png │ │ └── template.xml └── param.sfo ├── script.lua ├── thread_net.lua ├── updater.lua ├── updater ├── param.sfo └── script.lua └── version /README.md: -------------------------------------------------------------------------------- 1 | # Account Manager 2 | 3 | This app made with Onelua Team's help, based on elpendor's account switcher, will let you manage multiple accounts on your PS Vita. 4 | 5 | Keep the login files of your different accounts at hand with this app, plus, be able to change them at any time without the need to format your console (of course, after creating each account's folder), and without the need to format your memory card. 6 | 7 | It does support elpendor's account switcher profile folders, just move them to the following path ux0:pspemu/PSP/SAVEDATA/ACTM00001 8 | 9 | This app can save the current account data, delete it, delete the saved account profile folder or swap the current account to a previously saved account with the touch of a button!. 10 | 11 | First time using it press X to save the current account data, then if you want to login to a different profile press O to delete the current account data, the console will restart, you'll go through the time, date, language, set account initial settings, you can introduce your credentials here or skip to the video, is up to you. 12 | 13 | The first time you save your profiles you might think is taking a long time, but think about doing it everytime without an app like this (own experience). 14 | 15 | It comes with an improved user friendly interface plus the saved accounts are stored at ux0:pspemu/PSP/SAVEDATA/ACTM00001 in case you want to tranfer them to your pc via qcma. 16 | 17 | Controls: 18 | 1. Press X to save the current account data (will create a folder with a portion of the login email, anything before "@") 19 | 2. Press O to delete the current account data (will only delete the necesary files so you can login to a different account, after using this option, the ps vita will restart as if it was restored, without losing anything from the MC, only the id.dat XD) 20 | 3. Press [] to jump from the current account to the selected one (to do this you need to have saved profiles, you can use the ones created with elpendor's account switcher, although you have to move them to the following path ux0:pspemu/PSP/SAVEDATA/ACTM00001) 21 | After changing accounts a reboot is automatically done so, dont forget to activate henkaku again. 22 | 4. Press /\ to delete a saved account folder (only in case you need to, maybe last time you saved your profile data your console was not activated, maybe...) 23 | 24 | Please report any errors or bugs, hope you find this app usefull! 25 | 26 | Credits go to: 27 | 1. Onelua Team for their support and friendship 28 | 2. Elpendor for his account switcher 29 | 3. Theflow for all his work specially the updater 30 | 4. Team molecule (do I have to say why XD) 31 | 5. Everyone else in the scene keep doing all that good work 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /eboot.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ONElua/AccountManager/36cb4004636af81321fab5080842bcfe4604e5c0/eboot.bin -------------------------------------------------------------------------------- /param.sfo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ONElua/AccountManager/36cb4004636af81321fab5080842bcfe4604e5c0/param.sfo -------------------------------------------------------------------------------- /resources/ICON0.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ONElua/AccountManager/36cb4004636af81321fab5080842bcfe4604e5c0/resources/ICON0.PNG -------------------------------------------------------------------------------- /resources/PARAM.SFO: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ONElua/AccountManager/36cb4004636af81321fab5080842bcfe4604e5c0/resources/PARAM.SFO -------------------------------------------------------------------------------- /resources/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ONElua/AccountManager/36cb4004636af81321fab5080842bcfe4604e5c0/resources/back.png -------------------------------------------------------------------------------- /resources/buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ONElua/AccountManager/36cb4004636af81321fab5080842bcfe4604e5c0/resources/buttons.png -------------------------------------------------------------------------------- /resources/functions.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | ## Library Scroll ## 3 | Designed By DevDavis (Davis Nuñez) 2011 - 2016. 4 | Based on library of Robert Galarga. 5 | Create a obj scroll, this is very usefull for list show 6 | ]] 7 | function newScroll(a,b,c) 8 | local obj = {ini=1,sel=1,lim=1,maxim=1,minim = 1} 9 | 10 | function obj:set(tab,mxn,modemintomin) -- Set a obj scroll 11 | obj.ini,obj.sel,obj.lim,obj.maxim,obj.minim = 1,1,1,1,1 12 | --os.message(tostring(type(tab))) 13 | if(type(tab)=="number")then 14 | if tab > mxn then obj.lim=mxn else obj.lim=tab end 15 | obj.maxim = tab 16 | else 17 | if #tab > mxn then obj.lim=mxn else obj.lim=#tab end 18 | obj.maxim = #tab 19 | end 20 | if modemintomin then obj.minim = obj.lim end 21 | end 22 | 23 | function obj:max(mx) 24 | obj.maxim = #mx 25 | end 26 | 27 | function obj:up() 28 | if obj.sel>obj.ini then obj.sel=obj.sel-1 29 | elseif obj.ini-1>=obj.minim then 30 | obj.ini,obj.sel,obj.lim=obj.ini-1,obj.sel-1,obj.lim-1 31 | end 32 | end 33 | 34 | function obj:down() 35 | if obj.sel 2 | 3 | 4 | bg0.png 5 | 6 | 7 | startup.png 8 | 9 | 10 | 11 | 12 | frame_icon.png 13 | 14 | 15 | Documentation 16 | 17 | 18 | http://ONElua.x10.mx 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |   27 | 28 |   29 | 30 | 31 | ®2016 Team ONElua - ONElua.x10.mx 32 | 33 | 34 | es 35 | 36 | 37 | 38 |   39 | 40 |   41 | 42 | 43 | ®2016 Team ONElua - ONElua.x10.mx 44 | 45 | 46 | es 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /sce_sys/param.sfo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ONElua/AccountManager/36cb4004636af81321fab5080842bcfe4604e5c0/sce_sys/param.sfo -------------------------------------------------------------------------------- /script.lua: -------------------------------------------------------------------------------- 1 | ----------Account Manager------------ 2 | splash.zoom("ux0:app/ACTMANGER/resources/back.png") 3 | color.loadpalette() 4 | back = image.load("resources/back.png") 5 | buttonskey = image.load("resources/buttons.png",20,20) 6 | PAR="ux0:app/ACTMANGER/resources/PARAM.SFO" 7 | ICO="ux0:app/ACTMANGER/resources/ICON0.PNG" 8 | id = ((os.login() or "")/"@")[1] 9 | ACCOUNTF="ux0:pspemu/PSP/SAVEDATA/ACTM00001/" 10 | MISC="ur0:user/00/np/myprofile.dat" 11 | 12 | __NAMEVPK = "Account_Manager" 13 | dofile("updater.lua") 14 | 15 | dofile("resources/functions.lua") 16 | 17 | -----------------Menu--------------------- 18 | list=nil 19 | 20 | function get_list() 21 | list = files.listdirs(ACCOUNTF) 22 | end 23 | 24 | get_list() 25 | scroll = newScroll(list,10) 26 | 27 | if not files.exists(ACCOUNTF) then create_f() end ---functions.lua 28 | 29 | while true do 30 | buttons.read() 31 | if back then back:blit(0,0) end 32 | 33 | ---------------------------Impresion en pantalla----------------------------------- 34 | screen.print(480,10,"Account Manager",1,color.white,color.black,__ACENTER) 35 | 36 | if buttonskey then buttonskey:blitsprite(10,490,0) end 37 | screen.print(40,490,"To save Account Data",1,color.green,color.black) 38 | 39 | if buttonskey then buttonskey:blitsprite(920,490,2) end 40 | screen.print(910,490,"To change Account Data",1,color.yellow,color.black,__ARIGHT) 41 | 42 | if buttonskey then buttonskey:blitsprite(920,520,1) end 43 | screen.print(910,520,"To delete Account folder",1,color.yellow,color.black,__ARIGHT) 44 | 45 | if buttonskey then buttonskey:blitsprite(10,520,3) end 46 | screen.print(40,520,"To delete current account:",1,color.red,color.black) 47 | 48 | screen.print(315,520,id,1,color.yellow,color.black) 49 | 50 | ----------------------------------Controles de lista------------------------------- 51 | if list and #list > 0 then 52 | if buttons.up then scroll:up() end 53 | if buttons.down then scroll:down() end 54 | 55 | y=70 56 | for i=scroll.ini, scroll.lim do 57 | if i == scroll.sel then draw.fillrect(10,y-3,940,25,color.new(255,0,0,100)) end 58 | screen.print(15,y,string.format("%02d",i)..". "..list[i].name,1,color.white,color.black) 59 | y+=26 60 | end 61 | else 62 | screen.print(480,70,"you have no account data saved yet",1,color.yellow,color.black,__ACENTER) 63 | end 64 | 65 | if buttons.cross then ---Guardamos los datos de la cuenta existente 66 | if id == "" then 67 | os.message("\nThere is no account data to be saved",0) 68 | else 69 | if not files.exists(ACCOUNTF+id) then 70 | save_account() ---functions.lua 71 | --Actualizamos lista 72 | get_list() 73 | scroll:set(list,10) 74 | else 75 | os.message("\nThe account data already exists!",0) 76 | end 77 | end 78 | end 79 | 80 | if buttons.square then ---Cambiamos de cuenta ...hay q asegurarnos q hay algo en la lista 81 | if list and #list > 0 then 82 | if id != list[scroll.sel].name then 83 | restore_account() ---functions.lua 84 | else 85 | os.message("\nYou are on this account already",0) 86 | end 87 | else 88 | os.message("\nThere is no accounts to restore",0) 89 | end 90 | end 91 | 92 | if buttons.circle then ---Borramos cuenta existente 93 | if os.login() == "" then 94 | os.message("\nYou haven't login to any account yet",0) 95 | else 96 | if os.message("\nAre you sure you want to remove the current account?? \nIf you do so, this action can not be reversed!! ",1) == 1 then 97 | remove_account() ---functions.lua 98 | end 99 | end 100 | end 101 | 102 | if buttons.triangle then ---Borramos carpeta de datos de cuenta 103 | if list and #list > 0 then 104 | if os.message("\nYou really want to delete \n \n"+list[scroll.sel].name+"\n \nAccount folder??",1) == 1 then 105 | files.delete(ACCOUNTF..list[scroll.sel].name) 106 | get_list() 107 | scroll:set(list,10) 108 | end 109 | else 110 | os.message("\nThere is no account folders to delete",0) 111 | end 112 | end 113 | 114 | screen.flip() 115 | 116 | end 117 | -------------------------------------------------------------------------------- /thread_net.lua: -------------------------------------------------------------------------------- 1 | -- Global constants 2 | APP_VERSION_MAJOR = 0x01 -- major.minor 3 | APP_VERSION_MINOR = 0x00 4 | 5 | APP_VERSION = ((APP_VERSION_MAJOR << 0x18) | (APP_VERSION_MINOR << 0x10)) -- Union Binary 6 | 7 | UPDATE_PORT = channel.new("UPDATE_PORT") 8 | 9 | local version = http.get("https://raw.githubusercontent.com/ONElua/AccountManager/master/version") 10 | if version and tonumber(version) then 11 | version = tonumber(version) 12 | local major = (version >> 0x18) & 0xFF; 13 | local minor = (version >> 0x10) & 0xFF; 14 | if version > APP_VERSION then 15 | UPDATE_PORT:push(version) 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /updater.lua: -------------------------------------------------------------------------------- 1 | function onAppInstallCB(step, size_argv, written, file, totalsize, totalwritten) 2 | return 10 -- Ok code 3 | end 4 | 5 | function onNetGetFileCB(size,written,speed) 6 | if back then back:blit(0,0) end 7 | screen.print(10,10,"Downloading Update...") 8 | screen.print(10,30,"Size: "..tostring(size).." Written: "..tostring(written).." Speed: "..tostring(speed).."Kb/s") 9 | screen.print(10,50,"Porcent: "..math.floor((written*100)/size).."%") 10 | draw.fillrect(0,520,((written*960)/size),24,color.new(0,255,0)) 11 | screen.flip() 12 | buttons.read() 13 | if buttons.circle then return 0 end --Cancel or Abort 14 | return 1; 15 | end 16 | 17 | if files.exists("ux0:/app/ONEUPDATE") then 18 | game.delete("ONEUPDATE") -- Exists delete update app 19 | end 20 | 21 | UPDATE_PORT = channel.new("UPDATE_PORT") 22 | 23 | local scr_flip = screen.flip 24 | function screen.flip() 25 | scr_flip() 26 | if UPDATE_PORT:available() > 0 then 27 | local version = UPDATE_PORT:pop() 28 | local major = (version >> 0x01) & 0xFF; 29 | local minor = (version >> 0x10) & 0xFF; 30 | if os.message(__NAMEVPK.." "..string.format("%X.%02X",major, minor).." is now available.\n".."Do you want to update the application?", 1) == 1 then 31 | buttons.homepopup(0) 32 | 33 | local url = string.format("https://github.com/ONElua/AccountManager/releases/download/%s/%s", string.format("%X.%02X",major, minor), __NAMEVPK..".vpk") 34 | local path = "ux0:data/"..__NAMEVPK..".vpk" 35 | onAppInstall = onAppInstallCB 36 | onNetGetFile = onNetGetFileCB 37 | local res = http.getfile(url, path) 38 | if res then -- Success! 39 | files.mkdir("ux0:/data/1luapkg") 40 | files.copy("eboot.bin","ux0:/data/1luapkg") 41 | files.copy("updater/script.lua","ux0:/data/1luapkg/") 42 | files.copy("updater/param.sfo","ux0:/data/1luapkg/sce_sys/") 43 | game.installdir("ux0:/data/1luapkg") 44 | files.delete("ux0:/data/1luapkg") 45 | game.launch(string.format("ONEUPDATE&%s&%s",os.titleid(),path)) -- Goto installer extern! 46 | end 47 | 48 | buttons.homepopup(1) 49 | end 50 | end 51 | end 52 | 53 | THID = thread.new("thread_net.lua") -------------------------------------------------------------------------------- /updater/param.sfo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ONElua/AccountManager/36cb4004636af81321fab5080842bcfe4604e5c0/updater/param.sfo -------------------------------------------------------------------------------- /updater/script.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | Updater Of App. 3 | Designed by DevDavisNunez to ONElua projects.. :D 4 | TODO: 5 | Maybe, extract in APP, and only installdir in this.. 6 | ]] 7 | 8 | buttons.homepopup(0) 9 | 10 | color.loadpalette() 11 | 12 | args = os.arg() 13 | if args:len() == 0 then 14 | os.message("Error args lost!") 15 | os.exit() 16 | end 17 | 18 | args /= "&" 19 | if #args != 3 then 20 | os.message("Error args lost!") 21 | os.exit() 22 | end 23 | 24 | function onAppInstall(step, size_argv, written, file, totalsize, totalwritten) 25 | 26 | if step == 1 then -- Only msg of state 27 | draw.fillrect(0,0,960,30, color.green:a(100)) 28 | screen.print(10,10,"Search in vpk, Unsafe or Dangerous files!") 29 | screen.flip() 30 | elseif step == 2 then -- Alerta Vpk requiere confirmacion! 31 | return 10 -- Ok code 32 | elseif step == 3 then -- Unpack :P 33 | draw.fillrect(0,0,960,30, color.green:a(100)) 34 | screen.print(10,10,"Unpack vpk...") 35 | screen.print(925,10,"Percent Total: "..math.floor((totalwritten*100)/totalsize).." %",1.0,color.white, color.black, __ARIGHT) 36 | screen.print(10,35,"File: "..tostring(file)) 37 | screen.print(10,55,"Percent: "..math.floor((written*100)/size_argv).." %") 38 | draw.fillrect(0,544-30,(totalwritten*960)/totalsize,30, color.new(0,255,0)) 39 | screen.flip() 40 | elseif step == 4 then -- Promote o install :P 41 | draw.fillrect(0,0,960,30, color.green:a(100)) 42 | screen.print(10,10,"Installing...") 43 | screen.flip() 44 | end 45 | end 46 | 47 | game.install(args[3]) 48 | files.delete(args[3]) 49 | 50 | buttons.homepopup(1) 51 | 52 | game.launch(args[2]) -------------------------------------------------------------------------------- /version: -------------------------------------------------------------------------------- 1 | 17825792 2 | --------------------------------------------------------------------------------