mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-05-18 22:49:01 +01:00
4f7298e438
Due to filters being a built-in thingaroo now.
163 lines
4.1 KiB
Plaintext
163 lines
4.1 KiB
Plaintext
//A packet sniffer!!
|
|
|
|
/obj/item/device/net_sniffer
|
|
name = "Packet Sniffer"
|
|
desc = "An electronic device designed to intercept network transmissions."
|
|
icon_state = "sniffer0"
|
|
item_state = "electronic"
|
|
w_class = 4.0
|
|
rand_pos = 0
|
|
var/mode = 0
|
|
var/obj/machinery/power/data_terminal/link = null
|
|
var/filter_id = null
|
|
var/list/sniffFilters = list()
|
|
var/last_intercept = 0
|
|
var/list/packet_data = list()
|
|
var/max_logs = 8
|
|
|
|
attack_ai()
|
|
return
|
|
|
|
attack_hand(mob/user as mob)
|
|
if(mode)
|
|
src.interact(user)
|
|
return
|
|
|
|
else
|
|
..()
|
|
|
|
attackby(var/obj/item/I, var/mob/user)
|
|
if(istype(I, /obj/item/screwdriver))
|
|
if(!mode)
|
|
var/turf/T = loc
|
|
if(isturf(T) && !T.intact)
|
|
var/obj/machinery/power/data_terminal/test_link = locate() in T
|
|
if(test_link && !test_link.is_valid_master(test_link.master))
|
|
src.link = test_link
|
|
src.link.master = src
|
|
|
|
anchored = 1
|
|
mode = 1
|
|
user.visible_message("[user] attaches the [src] to the data terminal.","You attach the [src] to the data terminal.")
|
|
|
|
icon_state = "sniffer1"
|
|
|
|
else
|
|
|
|
boutput(user, "<span style=\"color:red\">The [src] couldn't be attached here!</span>")
|
|
return
|
|
|
|
else
|
|
boutput(user, "Device must be placed over a free data terminal to attach to it.")
|
|
return
|
|
else
|
|
anchored = 0
|
|
mode = 0
|
|
user.visible_message("[user] detaches the [src] from the data terminal.","You detach the [src] from the data terminal.")
|
|
icon_state = "sniffer0"
|
|
if(src.link)
|
|
src.link.master = null
|
|
src.link = null
|
|
return
|
|
else
|
|
..()
|
|
|
|
attack_self(mob/user as mob)
|
|
return interact(user)
|
|
|
|
proc/interact(mob/user as mob)
|
|
|
|
var/dat = "<html><head><title>Packet Sniffer</title></head><body>"
|
|
|
|
dat += "Current sender filter: <a href='byond://?src=\ref[src];filtid=1'>[src.filter_id ? src.filter_id : "NONE"]</a><br>"
|
|
|
|
dat += "<hr><b>Packet log:</b><hr>"
|
|
if(packet_data.len)
|
|
for(var/a in packet_data)
|
|
dat += "<tt>[a]</tt><br>"
|
|
else
|
|
dat += "<b>NONE</b>"
|
|
|
|
dat += "<hr>"
|
|
user << browse(dat,"window=packets")
|
|
onclose(user,"packets")
|
|
return
|
|
|
|
Topic(href, href_list)
|
|
..()
|
|
|
|
if (usr.contents.Find(src) || usr.contents.Find(src.master) || (istype(src.loc, /turf) && get_dist(src, usr) <= 1))
|
|
if (usr.stat || usr.restrained())
|
|
return
|
|
|
|
src.add_fingerprint(usr)
|
|
usr.machine = src
|
|
|
|
if(href_list["filtid"])
|
|
var/t = input(usr, "Please enter new filter net id", src.name, src.filter_id) as text
|
|
if (!t)
|
|
src.filter_id = null
|
|
src.updateIntDialog()
|
|
return
|
|
|
|
if (!in_range(src, usr) || usr.stat || usr.restrained())
|
|
return
|
|
|
|
if(length(t) != 8 || !ishex(t))
|
|
src.filter_id = null
|
|
src.updateIntDialog()
|
|
return
|
|
|
|
src.filter_id = t
|
|
|
|
src.updateIntDialog()
|
|
return
|
|
|
|
return
|
|
|
|
proc/updateIntDialog()
|
|
if(mode)
|
|
src.updateUsrDialog()
|
|
else
|
|
src.updateSelfDialog()
|
|
return
|
|
|
|
receive_signal(datum/signal/signal)
|
|
if(!mode || !src.link)
|
|
return
|
|
if(!signal || signal.encryption)
|
|
return
|
|
|
|
if(signal.transmission_method != TRANSMISSION_WIRE) //No radio for us thanks
|
|
return
|
|
|
|
var/target = signal.data["address_1"]
|
|
if(src.filter_id && src.filter_id != target)
|
|
return
|
|
|
|
var/badcheck = 0
|
|
for(var/check in src.sniffFilters)
|
|
if(!(check in signal.data) || signal.data[check] != src.filters[check])
|
|
badcheck = 1
|
|
break
|
|
if(badcheck)
|
|
return
|
|
|
|
if(!src.last_intercept || src.last_intercept + 40 <= world.time)
|
|
playsound(src.loc, "sound/machines/twobeep.ogg", 25, 1)
|
|
//src.packet_data = signal.data:Copy()
|
|
var/newdat = "<b>\[[time2text(world.timeofday,"mm:ss")]:[(world.timeofday%10)]\]:</b>"
|
|
for (var/i in signal.data)
|
|
newdat += "[i][isnull(signal.data[i]) ? "; " : "=[signal.data[i]]; "]"
|
|
|
|
if (signal.data_file)
|
|
. = signal.data_file.asText()
|
|
newdat += "<br>Included file ([signal.data_file.name], [signal.data_file.extension]): [. ? . : "Not printable."]"
|
|
|
|
src.packet_data += newdat
|
|
if (src.packet_data.len > src.max_logs)
|
|
src.packet_data.Cut(1,2)
|
|
src.last_intercept = world.time
|
|
src.updateIntDialog()
|
|
return
|