Last active
December 14, 2019 02:26
-
-
Save bmwalters/a5dfd114b067ea5e84c7 to your computer and use it in GitHub Desktop.
Lua SteamID class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- version 1.2.0 | |
-- ported from https://github.com/DoctorMcKay/node-steamid/blob/master/index.js | |
-- thanks to https://developer.valvesoftware.com/wiki/SteamID | |
local steamid = {} | |
steamid.Universe = { | |
INVALID = 0, | |
PUBLIC = 1, | |
BETA = 2, | |
INTERNAL = 3, | |
DEV = 4, | |
} | |
steamid.Type = { | |
INVALID = 0, | |
INDIVIDUAL = 1, | |
MULTISEAT = 2, | |
GAMESERVER = 3, | |
ANON_GAMESERVER = 4, | |
PENDING = 5, | |
CONTENT_SERVER = 6, | |
CLAN = 7, | |
CHAT = 8, | |
P2P_SUPER_SEEDER = 9, | |
ANON_USER = 10, | |
} | |
steamid.Instance = { | |
ALL = 0, | |
DESKTOP = 1, | |
CONSOLE = 2, | |
WEB = 4, | |
} | |
steamid.TypeChars = { | |
[steamid.Type.INVALID] = "I", | |
[steamid.Type.INDIVIDUAL] = "U", | |
[steamid.Type.MULTISEAT] = "M", | |
[steamid.Type.GAMESERVER] = "G", | |
[steamid.Type.ANON_GAMESERVER] = "A", | |
[steamid.Type.PENDING] = "P", | |
[steamid.Type.CONTENT_SERVER] = "C", | |
[steamid.Type.CLAN] = "g", | |
[steamid.Type.CHAT] = "T", | |
[steamid.Type.ANON_USER] = "a", | |
} | |
steamid.AccountIDMask = 0xFFFFFFFF | |
steamid.AccountInstanceMask = 0x000FFFFF | |
steamid.ChatInstanceFlags = { | |
Clan = (steamid.AccountInstanceMask + 1) >> 1, | |
Lobby = (steamid.AccountInstanceMask + 1) >> 2, | |
MMSLobby = (steamid.AccountInstanceMask + 1) >> 3, | |
} | |
local STEAMID = {} | |
STEAMID.__index = STEAMID | |
function STEAMID:initialize(sid) | |
self.universe = steamid.Universe.INVALID | |
self.type = steamid.Type.INVALID | |
self.instance = steamid.Instance.ALL | |
self.accountid = 0 | |
if not sid then return end | |
sid = tostring(sid) | |
-- steam2 | |
do | |
local universe, acclow, acchigh = string.match(sid, "^STEAM_([0-5]):([0-1]):([0-9]+)$") | |
if universe and acclow and acchigh then | |
self.universe = tonumber(universe) | |
if self.universe == steamid.Universe.INVALID then self.universe = steamid.Universe.PUBLIC end | |
self.type = steamid.Type.INDIVIDUAL | |
self.instance = steamid.Instance.DESKTOP | |
self.accountid = (tonumber(acchigh) << 1) + tonumber(acclow) | |
return | |
end | |
end | |
-- sid64 (community id) | |
do | |
local n = tonumber(sid) | |
if n and #sid >= 16 then | |
self.universe = n >> 56 | |
if self.universe == steamid.Universe.INVALID then self.universe = steamid.Universe.PUBLIC end | |
self.type = (n >> 52) & (2^4 - 1) | |
self.instance = (n >> 32) & (2^20 - 1) | |
self.accountid = n & (2^32 - 1) | |
return | |
end | |
end | |
-- steam3 | |
do | |
local typechar, universe, accountid, instance = string.match(sid, "^%[(%a):([0-5]):(%d+)(.*)%]$") | |
if typechar and universe and accountid then | |
self.universe = tonumber(universe) | |
if self.universe == steamid.Universe.INVALID then self.universe = steamid.Universe.PUBLIC end | |
self.accountid = tonumber(accountid) | |
if instance and instance ~= "" then | |
self.instance = tonumber(string.sub(instance, 2)) -- remove ":" in instance | |
elseif typechar == "U" then | |
self.instance = steamid.Instance.DESKTOP | |
end | |
if typechar == "c" then | |
self.instance = (self.instance | steamid.ChatInstanceFlags.Clan) | |
self.type = steamid.Type.CHAT | |
elseif typechar == "L" then | |
self.instance = (self.instance | steamid.ChatInstanceFlags.Lobby) | |
self.type = steamid.Type.CHAT | |
else | |
for k, v in pairs(steamid.TypeChars) do | |
if v == typechar then | |
self.type = k | |
break | |
end | |
end | |
end | |
return | |
end | |
end | |
-- plain accountid; you'll have to fill in other fields yourself | |
do | |
local n = tonumber(sid) | |
if n and #sid < 16 then | |
self.accountid = n | |
return | |
end | |
end | |
end | |
function STEAMID:to64() | |
return (self.universe << 56) | (self.type << 52) | (self.instance << 32) | self.accountid | |
end | |
function STEAMID:tosteam2() | |
if self.type ~= steamid.Type.INDIVIDUAL then return end | |
return "STEAM_" .. (self.universe == steamid.Universe.PUBLIC and 0 or self.universe) .. ':' .. (self.accountid & 1) .. ':' .. (self.accountid >> 1) | |
end | |
function STEAMID:tosteam3() | |
local typechar = steamid.TypeChars[self.type] or "i" | |
if (self.instance & steamid.ChatInstanceFlags.Clan) ~= 0 then | |
typechar = "c" | |
elseif (self.instance & steamid.ChatInstanceFlags.Lobby) ~= 0 then | |
typechar = "L" | |
end | |
local useinstance = (self.type == steamid.Type.ANON_GAMESERVER or self.type == steamid.Type.MULTISEAT or (self.type == steamid.Type.INDIVIDUAL and self.instance ~= steamid.Instance.DESKTOP)) | |
return "[" .. typechar .. ":" .. self.universe .. ":" .. self.accountid .. (useinstance and (":" .. self.instance) or "") .. "]" | |
end | |
function STEAMID:__tostring() | |
return "steamid " .. self:tosteam3() | |
end | |
local function SteamID(...) | |
local s = setmetatable({}, STEAMID) | |
s:initialize(...) | |
return s | |
end | |
return SteamID | |
--[[ | |
local s = SteamID("STEAM_0:0:46161927") | |
print(s.accountid) -- 92323854 | |
print(s:to64()) -- 76561198052589582 | |
print(s:tosteam2()) -- STEAM_0:0:46161927 | |
print(s:tosteam3()) -- [U:1:92323854] | |
local s2 = SteamID("85568392920136453") | |
print(s2.accountid) -- 97029 | |
print(s2:to64()) -- 85568392920136453 | |
print(s2:tosteam2()) -- (nil) | |
print(s2:tosteam3()) -- [G:1:97029] | |
--]] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment