database
var
keys = list()
banned_keys = list()
banned_ips = list()
banned_ids = list()
unbanned_keys = list()
unbanned_ips = list()
unbanned_ids = list()
proc
process_account(client/M)
if( !(M) )return
if( !(M.ckey in keys) )
keys += M.ckey
keys[M.ckey] = list(M.ckey, "Ips" = list(), "Ids" = list())
keys[M.ckey]["Ips"] += M.address
keys[M.ckey]["Ids"] += M.computer_id
if( !(M.computer_id in keys[M.ckey]["Ids"]) )
keys[M.ckey]["Ids"] += M.computer_id
if( !(M.address in keys[M.ckey]["Ips"]) )
keys[M.ckey]["Ips"] += M.address
link_accounts(mob/M)
if( !(M) )return
var
html = null
for(var/a in database.keys) if( database.keys[a] != database.keys[M.ckey])
for( var/i in 1 to length(database.keys[M.ckey]["Ips"]) )
if( database.keys[M.ckey]["Ips"][i] in database.keys[a]["Ips"])
html += " [database.keys[a][1]]<br>"
for( var/i in 1 to length(database.keys[M.ckey]["Ids"]) )
if( database.keys[M.ckey]["Ids"][i] in database.keys[a]["Ids"] && !( findtext(html, database.keys[a][1])) )
html += " [database.keys[a][1]]<br>"
if( html == null)
html += " No one is associated with this person."
return html
chain_ban_accounts(db)
if( (db in unbanned_keys) )
chain_unban_accounts(db)
banned_keys += db
unbanned_keys -= db
for(var/a in database.keys)
if( !(database.keys[a] in banned_keys) && database.keys[a] != database.keys[db] )
banned_keys += database.keys[a][1]
for( var/i in 1 to length(database.keys[db]["Ips"]) )
if( database.keys[db]["Ips"][i] in database.keys[a]["Ips"])
if( !(database.keys[a]["Ips"] in banned_ips) )
banned_ips += database.keys[a]["Ips"]
unbanned_ips -= database.keys[a]["Ips"]
for( var/i in 1 to length(database.keys[db]["Ids"]) )
if( database.keys[db]["Ids"][i] in database.keys[a]["Ids"])
if( !(database.keys[a]["Ids"] in banned_ids) )
banned_ids += database.keys[a]["Ids"]
unbanned_ids -= database.keys[a]["Ids"]
Now I have this code snippet here that links accounts together based on computer ID and IP Addresses(I also conveniently use this for handling any ban system). This code snippet works fine, but I was thinking and I'm going to come across a huge problem in the future. Once there are thousands and thousands of entries in this list it's going to take a long time to index through all of the entires in the keys list(and each entry even has lists of it's own).
Is there any better way of doing it, or a more efficient way?
Done.
As for simplifying it. You can't really just eliminate the looping, but you can make things cleaner by encapsulating the logic in a datum. I'll assume you don't care about only IP-banning or only key-banning a certain person, so in other words, whoever you ban, you use all methods to do so.
A way to do it is to set up a small "identity system". Each player will have an identity datum that represents his identity. It would be saved in a separate savefile and kept track of.
Hmm, ended up longer than I expected, so I rushed a bit. At any case, that should give you the idea.