code:
..code\world.dm Lines: 27, 28, 98?, 102?, 119?, 149?, 230? Total Colons: 7
..code\ATMOSPHERICS\atmospherics.dm Lines: 213? Total Colons: 1
..code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm Lines: 137? Total Colons: 1
..code\ATMOSPHERICS\components\binary_devices\passive_gate.dm Lines: 134?, 163? Total Colons: 2
..code\ATMOSPHERICS\components\binary_devices\pump.dm Lines: 43?, 139?, 167? Total Colons: 3
..code\ATMOSPHERICS\components\binary_devices\valve.dm Lines: 25?, 33?, 38? Total Colons: 3
..code\ATMOSPHERICS\components\binary_devices\volume_pump.dm Lines: 42?, 136?, 163? Total Colons: 3
..code\ATMOSPHERICS\components\trinary_devices\filter.dm Lines: 66?, 69?, 214? Total Colons: 3
..code\ATMOSPHERICS\components\trinary_devices\mixer.dm Lines: 36?, 39?, 151? Total Colons: 3
..code\ATMOSPHERICS\components\unary_devices\cryo.dm Lines: 152?, 187?, 189, 190, 312?, 313? Total Colons: 7
..code\ATMOSPHERICS\components\unary_devices\Freezer.dm Lines: 82?, 205? Total Colons: 2
..code\ATMOSPHERICS\components\unary_devices\vent_pump.dm Lines: 175?, 196?, 197?, 228? Total Colons: 4
..code\ATMOSPHERICS\components\unary_devices\vent_scrubber.dm Lines: 140?, 141? Total Colons: 2
..code\ATMOSPHERICS\pipes\manifold.dm Lines: 28? Total Colons: 1
..code\ATMOSPHERICS\pipes\manifold4w.dm Lines: 19? Total Colons: 1
..code\ATMOSPHERICS\pipes\pipes.dm Lines: 30?, 32?, 33?, 34?, 43? Total Colons: 5
..code\ATMOSPHERICS\pipes\heat_exchange\manifold.dm Lines: 25?, 51? Total Colons: 2
..code\controllers\subsystem\air.dm Lines: 100 Total Colons: 1
..code\controllers\subsystem\bots.dm Lines: 18, 20 Total Colons: 2
..code\controllers\subsystem\diseases.dm Lines: 18 Total Colons: 1
..code\controllers\subsystem\events.dm Lines: 41, 199?, 200? Total Colons: 3
..code\controllers\subsystem\jobs.dm Lines: 370? Total Colons: 1
..code\controllers\subsystem\machines.dm Lines: 41, 42, 43 Total Colons: 3
..code\controllers\subsystem\mobs.dm Lines: 20 Total Colons: 1
..code\controllers\subsystem\objects.dm Lines: 37 Total Colons: 1
..code\controllers\subsystem\shuttles.dm Lines: 251?, 253, 261?, 262?, 284, 285 Total Colons: 6
..code\controllers\subsystem\ticker.dm Lines: 382?, 405? Total Colons: 4
..code\controllers\subsystem\voting.dm Lines: 203?, 211? Total Colons: 2
..code\controllers\subsystem\shuttles\emergency.dm Lines: 52?, 65? Total Colons: 4
..code\controllers\subsystem\shuttles\supply.dm Lines: 97, 316?, 347?, 488?, 505? Total Colons: 10
..code\datums\browser.dm Lines: 79? Total Colons: 1
..code\datums\datacore.dm Lines: 91?, 127?, 132?, 137?, 142?, 147?, 152?, 157?, 163?, 169?, 259? Total Colons: 23
..code\datums\datumvars.dm Lines: 57?, 93 Total Colons: 3
..code\datums\material_container.dm Lines: 194? Total Colons: 1
..code\datums\mind.dm Lines: 228?, 229?, 290?, 581?, 633, 634, 643, 648, 720?, 1243, 1244, 1245 Total Colons: 13
..code\datums\mutations.dm Lines: 34?, 135?, 329? Total Colons: 3
..code\datums\recipe.dm Lines: 52?, 114?, 115? Total Colons: 3
..code\datums\diseases\_disease.dm Lines: 125? Total Colons: 1
..code\datums\helper_datums\teleport.dm Lines: 63?, 64?, 74?, 75? Total Colons: 4
..code\datums\helper_datums\topic_input.dm Lines: 23?, 27?, 31?, 35?, 42?, 46?, 50?, 56?, 60? Total Colons: 9
..code\datums\spells\dumbfire.dm Lines: 43 Total Colons: 1
..code\datums\spells\knock.dm Lines: 21 Total Colons: 1
..code\datums\spells\projectile.dm Lines: 35 Total Colons: 1
..code\datums\wires\airlock.dm Lines: 37?, 38?, 39?, 40?, 41?, 42?, 43? Total Colons: 7
..code\datums\wires\alarm.dm Lines: 21? Total Colons: 3
..code\datums\wires\apc.dm Lines: 13? Total Colons: 3
..code\datums\wires\autolathe.dm Lines: 13? Total Colons: 3
..code\datums\wires\particle_accelerator.dm Lines: 50? Total Colons: 1
..code\datums\wires\pizza_bomb.dm Lines: 45?, 46? Total Colons: 2
..code\datums\wires\robot.dm Lines: 16?, 17?, 18? Total Colons: 4
..code\datums\wires\r_n_d.dm Lines: 48?, 49?, 50? Total Colons: 3
..code\datums\wires\syndicatebomb.dm Lines: 46?, 75? Total Colons: 2
..code\datums\wires\vending.dm Lines: 28?, 29?, 30?, 31? Total Colons: 4
..code\datums\wires\wires.dm Lines: 119?, 121? Total Colons: 2
..code\game\atoms.dm Lines: 297? Total Colons: 1
..code\game\atoms_movable.dm Lines: 181?, 182?, 216? Total Colons: 3
..code\game\communications.dm Lines: 288 Total Colons: 3
..code\game\data_huds.dm Lines: 35? Total Colons: 1
..code\game\dna.dm Lines: 231? Total Colons: 1
..code\game\say.dm Lines: 45?, 49? Total Colons: 2
..code\game\sound.dm Lines: 72? Total Colons: 1
..code\game\gamemodes\antag_spawner.dm Lines: 103, 104 Total Colons: 3
..code\game\gamemodes\objective.dm Lines: 84?, 112?, 139?, 172?, 201?, 433, 806 Total Colons: 7
..code\game\gamemodes\abduction\abduction_gear.dm Lines: 159? Total Colons: 1
..code\game\gamemodes\abduction\machinery\experiment.dm Lines: 41?, 107? Total Colons: 2
..code\game\gamemodes\blob\blob_finish.dm Lines: 47? Total Colons: 1
..code\game\gamemodes\blob\blob_report.dm Lines: 64, 70, 76, 85 Total Colons: 4
..code\game\gamemodes\changeling\evolution_menu.dm Lines: 59? Total Colons: 3
..code\game\gamemodes\changeling\powers\adrenaline.dm Lines: 12? Total Colons: 1
..code\game\gamemodes\changeling\powers\mutations.dm Lines: 83? Total Colons: 1
..code\game\gamemodes\cult\cult.dm Lines: 44? Total Colons: 1
..code\game\gamemodes\cult\runes.dm Lines: 705?, 706? Total Colons: 2
..code\game\gamemodes\gang\dominator.dm Lines: 101?, 187? Total Colons: 2
..code\game\gamemodes\gang\gang.dm Lines: 261?, 266? Total Colons: 2
..code\game\gamemodes\gang\gang_datum.dm Lines: 43?, 53?, 121? Total Colons: 3
..code\game\gamemodes\gang\gang_pen.dm Lines: 59? Total Colons: 1
..code\game\gamemodes\gang\recaller.dm Lines: 48?, 51? Total Colons: 4
..code\game\gamemodes\malfunction\malfunction.dm Lines: 63, 64, 65, 185, 188, 189, 192, 204, 205, 216, 218, 219, 221, 233, 234 Total Colons: 15
..code\game\gamemodes\meteor\meteors.dm Lines: 177? Total Colons: 2
..code\game\gamemodes\nuclear\nuclearbomb.dm Lines: 197?, 212?, 215?, 217?, 220?, 222?, 265?, 359, 359?, 360, 365, 383? Total Colons: 25
..code\game\gamemodes\revolution\revolution.dm Lines: 265?, 266?, 286? Total Colons: 3
..code\game\gamemodes\shadowling\shadowling.dm Lines: 304? Total Colons: 1
..code\game\gamemodes\traitor\traitor.dm Lines: 335? Total Colons: 1
..code\game\gamemodes\wizard\artefact.dm Lines: 148? Total Colons: 1
..code\game\gamemodes\wizard\rightandwrong.dm Lines: 9?, 10?, 11? Total Colons: 3
..code\game\gamemodes\wizard\soulstone.dm Lines: 123, 195 Total Colons: 2
..code\game\gamemodes\wizard\spellbook.dm Lines: 93?, 512?, 533? Total Colons: 3
..code\game\gamemodes\wizard\wizard.dm Lines: 183?, 258, 261, 264, 278? Total Colons: 5
..code\game\machinery\airlock_control.dm Lines: 59?, 60? Total Colons: 2
..code\game\machinery\ai_slipper.dm Lines: 39?, 67, 77?, 93? Total Colons: 5
..code\game\machinery\alarm.dm Lines: 134?, 135?, 730?, 742?, 895?, 934?, 1056?, 1071?, 1127?, 1128? Total Colons: 16
..code\game\machinery\announcement_system.dm Lines: 45?, 47?, 136?, 137? Total Colons: 4
..code\game\machinery\atmo_control.dm Lines: 273?, 284?, 396? Total Colons: 3
..code\game\machinery\autolathe.dm Lines: 139?, 178?, 187?, 295?, 322?, 336?, 345? Total Colons: 10
..code\game\machinery\Beacon.dm Lines: 31? Total Colons: 1
..code\game\machinery\buttons.dm Lines: 22?, 23? Total Colons: 4
..code\game\machinery\cell_charger.dm Lines: 15?, 31?, 64? Total Colons: 4
..code\game\machinery\cloning.dm Lines: 88?, 92? Total Colons: 2
..code\game\machinery\constructable_frame.dm Lines: 48?, 90?, 94?, 99?, 102?, 475? Total Colons: 8
..code\game\machinery\deployable.dm Lines: 92 Total Colons: 1
..code\game\machinery\dna_scanner.dm Lines: 44?, 48?, 57? Total Colons: 3
..code\game\machinery\droneDispenser.dm Lines: 190? Total Colons: 1
..code\game\machinery\iv_drip.dm Lines: 192?, 200?, 210? Total Colons: 3
..code\game\machinery\lightswitch.dm Lines: 41? Total Colons: 1
..code\game\machinery\machinery.dm Lines: 372?, 375? Total Colons: 2
..code\game\machinery\magnet.dm Lines: 53?, 275?, 279? Total Colons: 3
..code\game\machinery\navbeacon.dm Lines: 63?, 84?, 92?, 122?, 130? Total Colons: 6
..code\game\machinery\newscaster.dm Lines: 205?, 206?, 291?, 304?, 311?, 318?, 319?, 372, 391?, 409?, 420?, 423, 424?, 430?, 431?, 436, 460?, 465?, 486, 614?, 724?, 727?, 922 Total Colons: 27
..code\game\machinery\overview.dm Lines: 98, 167?, 243, 292? Total Colons: 4
..code\game\machinery\portable_turret.dm Lines: 162?, 164?, 169?, 170?, 171?, 172?, 173?, 183?, 285?, 862?, 864?, 869?, 870?, 871?, 872?, 873?, 877?, 889?, 891?, 896?, 897?, 898?, 899?, 900?, 910?, 968?, 1049?, 1085, 1097?, 1098? Total Colons: 32
..code\game\machinery\recharger.dm Lines: 19? Total Colons: 1
..code\game\machinery\rechargestation.dm Lines: 122?, 124? Total Colons: 2
..code\game\machinery\recycler.dm Lines: 43?, 44?, 45?, 84? Total Colons: 4
..code\game\machinery\requests_console.dm Lines: 201?, 202?, 212?, 213? Total Colons: 4
..code\game\machinery\robot_fabricator.dm Lines: 21, 23, 24, 25, 28 Total Colons: 5
..code\game\machinery\shieldgen.dm Lines: 247?, 261?, 263?, 441? Total Colons: 4
..code\game\machinery\Sleeper.dm Lines: 142?, 156?, 162? Total Colons: 4
..code\game\machinery\slotmachine.dm Lines: 219?, 265?, 271? Total Colons: 3
..code\game\machinery\spaceheater.dm Lines: 33?, 35?, 37?, 69?, 89?, 107? Total Colons: 9
..code\game\machinery\status_display.dm Lines: 167 Total Colons: 4
..code\game\machinery\suit_storage_unit.dm Lines: 199?, 200?, 212?, 215?, 218?, 221?, 227?, 231?, 232?, 519? Total Colons: 12
..code\game\machinery\syndicatebeacon.dm Lines: 151? Total Colons: 1
..code\game\machinery\syndicatebomb.dm Lines: 22?, 53?, 77?, 323?, 326? Total Colons: 6
..code\game\machinery\teleporter.dm Lines: 69?, 442? Total Colons: 3
..code\game\machinery\turrets.dm Lines: 542?, 578, 590?, 591? Total Colons: 6
..code\game\machinery\vending.dm Lines: 248?, 323? Total Colons: 2
..code\game\machinery\atmoalter\canister.dm Lines: 248, 289?, 290?, 291?, 292?, 295?, 297? Total Colons: 7
..code\game\machinery\atmoalter\pump.dm Lines: 109? Total Colons: 3
..code\game\machinery\atmoalter\scrubber.dm Lines: 127?, 203? Total Colons: 3
..code\game\machinery\bots\bots.dm Lines: 244?, 337?, 338?, 340?, 416?, 481? Total Colons: 6
..code\game\machinery\bots\cleanbot.dm Lines: 84?, 85?, 87?, 88?, 109? Total Colons: 6
..code\game\machinery\bots\ed209bot.dm Lines: 107?, 109?, 115?, 116?, 117?, 118?, 119?, 120?, 155?, 258?, 456? Total Colons: 12
..code\game\machinery\bots\floorbot.dm Lines: 104?, 105?, 107?, 109?, 110?, 111?, 112?, 113?, 114?, 115?, 116?, 147?, 360? Total Colons: 13
..code\game\machinery\bots\medbot.dm Lines: 147?, 148?, 154?, 171?, 173?, 174?, 175?, 176?, 177?, 231?, 320?, 532? Total Colons: 12
..code\game\machinery\bots\mulebot.dm Lines: 99?, 147?, 187?, 209?, 210?, 211?, 225?, 226?, 227?, 228?, 249?, 282?, 346?, 354?, 363?, 535? Total Colons: 17
..code\game\machinery\bots\secbot.dm Lines: 97?, 99?, 104?, 105?, 106?, 107?, 108?, 109?, 142?, 222? Total Colons: 11
..code\game\machinery\camera\camera.dm Lines: 141?, 151?, 152? Total Colons: 3
..code\game\machinery\camera\tracking.dm Lines: 19?, 83? Total Colons: 2
..code\game\machinery\computer\arcade.dm Lines: 860?, 862?, 863?, 871? Total Colons: 6
..code\game\machinery\computer\camera.dm Lines: 56? Total Colons: 1
..code\game\machinery\computer\camera_advanced.dm Lines: 154? Total Colons: 1
..code\game\machinery\computer\card.dm Lines: 148?, 164?, 209?, 364?, 372?, 390? Total Colons: 6
..code\game\machinery\computer\cloning.dm Lines: 146? Total Colons: 1
..code\game\machinery\computer\communications.dm Lines: 106, 148?, 272?, 428?, 429?, 430, 453?, 468?, 531?, 532?, 533, 554? Total Colons: 12
..code\game\machinery\computer\crew.dm Lines: 153?, 158?, 169? Total Colons: 3
..code\game\machinery\computer\dna_console.dm Lines: 94?, 139?, 141?, 143?, 181? Total Colons: 5
..code\game\machinery\computer\medical.dm Lines: 40?, 46, 153? Total Colons: 4
..code\game\machinery\computer\message.dm Lines: 73?, 76?, 131?, 150? Total Colons: 4
..code\game\machinery\computer\Operating.dm Lines: 50? Total Colons: 1
..code\game\machinery\computer\pod.dm Lines: 56? Total Colons: 2
..code\game\machinery\computer\robot.dm Lines: 65?, 107?, 109?, 110?, 112?, 114? Total Colons: 6
..code\game\machinery\computer\security.dm Lines: 49?, 62, 117, 130, 275, 285 Total Colons: 7
..code\game\machinery\computer\shuttle.dm Lines: 24, 25, 28, 30, 33, 34, 47, 48, 60 Total Colons: 9
..code\game\machinery\computer\station_alert.dm Lines: 73? Total Colons: 1
..code\game\machinery\doors\airlock.dm Lines: 790?, 791?, 800?, 801?, 809?, 877, 888 Total Colons: 7
..code\game\machinery\doors\airlock_electronics.dm Lines: 81 Total Colons: 1
..code\game\machinery\doors\brigdoors.dm Lines: 123?, 158?, 247 Total Colons: 7
..code\game\machinery\doors\firedoor.dm Lines: 49?, 69 Total Colons: 2
..code\game\machinery\doors\windowdoor.dm Lines: 188?, 200, 276? Total Colons: 3
..code\game\machinery\embedded_controller\access_controller.dm Lines: 295?, 297? Total Colons: 2
..code\game\machinery\embedded_controller\airlock_controller.dm Lines: 258?, 259?, 260?, 261? Total Colons: 4
..code\game\machinery\pipe\construction.dm Lines: 134?, 162? Total Colons: 2
..code\game\machinery\telecomms\machine_interactions.dm Lines: 57?, 64?, 159?, 160?, 161?, 184?, 220? Total Colons: 7
..code\game\mecha\mecha.dm Lines: 561?, 582?, 838?, 843?, 935?, 936?, 937?, 986?, 987? Total Colons: 11
..code\game\mecha\mecha_control_console.dm Lines: 72? Total Colons: 1
..code\game\mecha\mecha_topic.dm Lines: 33?, 34?, 36?, 40?, 90?, 164?, 168?, 190?, 197? Total Colons: 21
..code\game\mecha\mecha_wreckage.dm Lines: 25?, 42? Total Colons: 2
..code\game\mecha\mech_fabricator.dm Lines: 120?, 132?, 237? Total Colons: 6
..code\game\mecha\combat\combat.dm Lines: 65?, 67? Total Colons: 3
..code\game\mecha\combat\durand.dm Lines: 38?, 50? Total Colons: 2
..code\game\mecha\combat\gygax.dm Lines: 69?, 74?, 105? Total Colons: 3
..code\game\mecha\combat\honker.dm Lines: 32?, 33?, 35? Total Colons: 14
..code\game\mecha\combat\marauder.dm Lines: 70?, 158?, 160? Total Colons: 5
..code\game\mecha\combat\phazon.dm Lines: 39?, 97?, 98? Total Colons: 3
..code\game\mecha\equipment\mecha_equipment.dm Lines: 57? Total Colons: 3
..code\game\mecha\equipment\tools\medical_tools.dm Lines: 96, 96?, 129?, 249?, 333?, 366, 370?, 371? Total Colons: 20
..code\game\mecha\equipment\tools\mining_tools.dm Lines: 40, 51 Total Colons: 2
..code\game\mecha\equipment\tools\other_tools.dm Lines: 132?, 160?, 182?, 222?, 328?, 406, 406?, 446? Total Colons: 10
..code\game\mecha\equipment\tools\work_tools.dm Lines: 329?, 350?, 351?, 368, 368? Total Colons: 7
..code\game\mecha\equipment\weapons\weapons.dm Lines: 208? Total Colons: 1
..code\game\mecha\working\ripley.dm Lines: 53?, 55? Total Colons: 2
..code\game\objects\explosion.dm Lines: 11?, 12?, 68? Total Colons: 5
..code\game\objects\items.dm Lines: 213? Total Colons: 1
..code\game\objects\items\candle.dm Lines: 23? Total Colons: 1
..code\game\objects\items\crayons.dm Lines: 117, 171?, 172?, 173?, 210? Total Colons: 5
..code\game\objects\items\toys.dm Lines: 133?, 187?, 234?, 452?, 471? Total Colons: 6
..code\game\objects\items\devices\aicard.dm Lines: 83?, 85?, 129?, 138? Total Colons: 4
..code\game\objects\items\devices\flashlight.dm Lines: 60? Total Colons: 2
..code\game\objects\items\devices\geiger_counter.dm Lines: 93? Total Colons: 1
..code\game\objects\items\devices\paicard.dm Lines: 40?, 41? Total Colons: 2
..code\game\objects\items\devices\scanners.dm Lines: 123?, 137?, 139?, 141?, 143?, 147?, 149, 164?, 212?, 396? Total Colons: 11
..code\game\objects\items\devices\taperecorder.dm Lines: 28?, 97, 117, 142 Total Colons: 4
..code\game\objects\items\devices\transfer_valve.dm Lines: 69?, 102 Total Colons: 6
..code\game\objects\items\devices\PDA\cart.dm Lines: 241, 245, 275, 292?, 293?, 294, 348?, 424, 435, 473?, 499?, 533?, 546?, 557?, 585, 594, 601, 605, 606, 609, 610, 611, 612, 631, 642?, 649?, 702?, 703?, 705?, 706?, 707?, 708?, 709?, 711, 712, 713, 716, 717, 718 Total Colons: 44
..code\game\objects\items\devices\PDA\PDA.dm Lines: 298?, 299?, 330?, 356?, 358?, 360?, 364?, 378?, 382?, 383?, 388, 390, 392, 618, 619, 631, 632, 692, 693, 918, 1010?, 1036, 1039, 1131?, 1143? Total Colons: 25
..code\game\objects\items\devices\radio\electropack.dm Lines: 129? Total Colons: 1
..code\game\objects\items\devices\radio\radio.dm Lines: 136?, 137, 137?, 138, 138?, 139, 140, 141, 143, 144, 146, 147?, 148, 148?, 149, 150, 151, 153, 154, 155 Total Colons: 22
..code\game\objects\items\robot\robot_parts.dm Lines: 137, 143, 150, 258?, 259?, 261?, 262?, 263?, 264? Total Colons: 11
..code\game\objects\items\robot\robot_upgrades.dm Lines: 250? Total Colons: 1
..code\game\objects\items\stacks\sheets\glass.dm Lines: 303? Total Colons: 1
..code\game\objects\items\weapons\AI_modules.dm Lines: 37?, 72?, 73?, 74? Total Colons: 4
..code\game\objects\items\weapons\cards_ids.dm Lines: 115?, 118?, 148? Total Colons: 6
..code\game\objects\items\weapons\cigs_lighters.dm Lines: 479?, 496? Total Colons: 2
..code\game\objects\items\weapons\cosmetics.dm Lines: 36?, 54? Total Colons: 2
..code\game\objects\items\weapons\defib.dm Lines: 470?, 485?, 487?, 489?, 491?, 508?, 527?, 530? Total Colons: 8
..code\game\objects\items\weapons\explosives.dm Lines: 57? Total Colons: 1
..code\game\objects\items\weapons\extinguisher.dm Lines: 45?, 46? Total Colons: 2
..code\game\objects\items\weapons\flamethrower.dm Lines: 90?, 128? Total Colons: 2
..code\game\objects\items\weapons\handcuffs.dm Lines: 208? Total Colons: 1
..code\game\objects\items\weapons\RCD.dm Lines: 500, 505 Total Colons: 4
..code\game\objects\items\weapons\singularityhammer.dm Lines: 42 Total Colons: 1
..code\game\objects\items\weapons\stunbaton.dm Lines: 94? Total Colons: 1
..code\game\objects\items\weapons\grenades\chem_grenade.dm Lines: 60? Total Colons: 1
..code\game\objects\items\weapons\grenades\grenade.dm Lines: 49? Total Colons: 1
..code\game\objects\items\weapons\implants\implantchair.dm Lines: 46?, 47?, 49? Total Colons: 5
..code\game\objects\items\weapons\implants\implantpad.dm Lines: 56 Total Colons: 1
..code\game\objects\items\weapons\storage\book.dm Lines: 180 Total Colons: 1
..code\game\objects\items\weapons\storage\fancy.dm Lines: 39? Total Colons: 1
..code\game\objects\items\weapons\storage\secure.dm Lines: 32?, 39?, 84? Total Colons: 3
..code\game\objects\items\weapons\storage\storage.dm Lines: 177? Total Colons: 1
..code\game\objects\items\weapons\tanks\jetpack.dm Lines: 26?, 44?, 151? Total Colons: 3
..code\game\objects\items\weapons\tanks\tanks.dm Lines: 121?, 122? Total Colons: 2
..code\game\objects\items\weapons\tanks\watertank.dm Lines: 177?, 178? Total Colons: 2
..code\game\objects\structures\ai_core.dm Lines: 212?, 213? Total Colons: 2
..code\game\objects\structures\displaycase.dm Lines: 119?, 128?, 130? Total Colons: 3
..code\game\objects\structures\fireaxe.dm Lines: 129? Total Colons: 1
..code\game\objects\structures\grille.dm Lines: 148?, 149? Total Colons: 2
..code\game\objects\structures\musician.dm Lines: 50?, 130?, 132? Total Colons: 3
..code\game\objects\structures\safe.dm Lines: 78?, 98?, 104?, 188? Total Colons: 4
..code\game\objects\structures\tank_dispenser.dm Lines: 43?, 44? Total Colons: 2
..code\game\objects\structures\watercloset.dm Lines: 51?, 54? Total Colons: 3
..code\game\objects\structures\windoor_assembly.dm Lines: 50? Total Colons: 1
..code\game\objects\structures\window.dm Lines: 197?, 199?, 201?, 206?, 207?, 211?, 215?, 218?, 222?, 223?, 425? Total Colons: 11
..code\game\objects\structures\beds_chairs\bed.dm Lines: 129? Total Colons: 1
..code\game\objects\structures\crates_lockers\closets.dm Lines: 66?, 234?, 241?, 243?, 392? Total Colons: 6
..code\game\objects\structures\transit_tubes\station.dm Lines: 130? Total Colons: 1
..code\game\objects\structures\transit_tubes\transit_tube_construction.dm Lines: 41?, 43? Total Colons: 2
..code\game\turfs\turf.dm Lines: 137, 248?, 250? Total Colons: 4
..code\game\turfs\space\space.dm Lines: 114?, 125? Total Colons: 2
..code\game\verbs\ooc.dm Lines: 44?, 53?, 55?, 57?, 69? Total Colons: 6
..code\LINDA\LINDA_turf_tile.dm Lines: 458?, 463? Total Colons: 2
..code\modules\admin\admin.dm Lines: 30?, 62?, 63?, 64?, 65?, 66?, 67?, 122, 129, 141, 192?, 205?, 212?, 246, 262?, 277?, 288?, 292, 293?, 300?, 301?, 306, 334?, 352, 415?, 442?, 550?, 551?, 676?, 677?, 696? Total Colons: 35
..code\modules\admin\admin_verbs.dm Lines: 441?, 442? Total Colons: 2
..code\modules\admin\create_poll.dm Lines: 25?, 26?, 94?, 95? Total Colons: 4
..code\modules\admin\newbanjob.dm Lines: 216? Total Colons: 2
..code\modules\admin\player_panel.dm Lines: 111?, 113?, 119?, 123?, 129?, 155?, 160?, 166?, 181?, 186?, 195?, 207?, 219?, 228?, 240?, 249?, 258?, 269?, 284?, 297? Total Colons: 36
..code\modules\admin\sql_notes.dm Lines: 153 Total Colons: 2
..code\modules\admin\topic.dm Lines: 299?, 310?, 341?, 348?, 349?, 447?, 986?, 1559?, 1561?, 1589?, 1796?, 1797?, 1798?, 1800?, 1982?, 2093?, 2096?, 2101?, 2102? Total Colons: 21
..code\modules\admin\DB ban\functions.dm Lines: 93, 94, 95, 127?, 131?, 304, 305, 306, 441? Total Colons: 20
..code\modules\admin\verbs\adminjump.dm Lines: 91, 127 Total Colons: 2
..code\modules\admin\verbs\deadsay.dm Lines: 24? Total Colons: 1
..code\modules\admin\verbs\debug.dm Lines: 82?, 86?, 89?, 112?, 116?, 289, 306, 498, 501 Total Colons: 9
..code\modules\admin\verbs\diagnostics.dm Lines: 15?, 81 Total Colons: 5
..code\modules\admin\verbs\massmodvar.dm Lines: 132 Total Colons: 1
..code\modules\admin\verbs\modifyvariables.dm Lines: 542 Total Colons: 1
..code\modules\admin\verbs\one_click_antag.dm Lines: 333?, 478?, 481?, 484?, 487?, 490?, 493?, 496?, 517? Total Colons: 9
..code\modules\admin\verbs\panicbunker.dm Lines: 10?, 11? Total Colons: 2
..code\modules\admin\verbs\randomverbs.dm Lines: 38?, 114?, 116?, 117?, 189?, 212?, 409?, 448?, 721?, 722?, 799, 804, 810, 816, 822, 828, 834, 840, 846, 852, 858, 864, 870, 876, 882, 888, 894, 900 Total Colons: 28
..code\modules\assembly\bomb.dm Lines: 44 Total Colons: 1
..code\modules\assembly\doorcontrol.dm Lines: 62? Total Colons: 1
..code\modules\assembly\health.dm Lines: 77? Total Colons: 1
..code\modules\assembly\infrared.dm Lines: 24?, 110? Total Colons: 3
..code\modules\assembly\mousetrap.dm Lines: 30?, 127? Total Colons: 2
..code\modules\assembly\proximity.dm Lines: 26?, 109?, 110? Total Colons: 3
..code\modules\assembly\signaler.dm Lines: 142? Total Colons: 1
..code\modules\assembly\timer.dm Lines: 75? Total Colons: 1
..code\modules\assembly\voice.dm Lines: 32? Total Colons: 1
..code\modules\awaymissions\maploader\reader.dm Lines: 262? Total Colons: 1
..code\modules\awaymissions\maploader\swapmaps.dm Lines: 152, 153, 154, 161?, 162?, 163?, 343?, 356?, 362?, 385? Total Colons: 19
..code\modules\client\client procs.dm Lines: 36, 36?, 177? Total Colons: 3
..code\modules\client\preferences.dm Lines: 129?, 130?, 151?, 161?, 166?, 186?, 335?, 336?, 337?, 338?, 339?, 340?, 341?, 342?, 343?, 349?, 350?, 353?, 356?, 397?, 523? Total Colons: 21
..code\modules\client\preferences_toggles.dm Lines: 7?, 16?, 25?, 34?, 43?, 54?, 64?, 74?, 83?, 92?, 113?, 122?, 172?, 226?, 235?, 259? Total Colons: 16
..code\modules\clothing\clothing.dm Lines: 357? Total Colons: 1
..code\modules\clothing\glasses\engine_goggles.dm Lines: 83?, 108? Total Colons: 2
..code\modules\clothing\head\helmet.dm Lines: 240? Total Colons: 1
..code\modules\clothing\head\soft_caps.dm Lines: 45? Total Colons: 1
..code\modules\clothing\masks\gasmask.dm Lines: 66? Total Colons: 1
..code\modules\clothing\masks\miscellaneous.dm Lines: 56? Total Colons: 1
..code\modules\clothing\shoes\bananashoes.dm Lines: 59?, 65? Total Colons: 3
..code\modules\clothing\shoes\magboots.dm Lines: 32?, 41? Total Colons: 2
..code\modules\clothing\spacesuits\chronosuit.dm Lines: 146, 151, 152, 153, 158, 172, 175, 176, 177 Total Colons: 9
..code\modules\crafting\table.dm Lines: 15, 59, 113, 126, 143, 167 Total Colons: 6
..code\modules\detectivework\detective_work.dm Lines: 16? Total Colons: 1
..code\modules\events\event.dm Lines: 37 Total Colons: 2
..code\modules\events\shuttle_loan.dm Lines: 195, 196 Total Colons: 2
..code\modules\flufftext\Hallucination.dm Lines: 47?, 49?, 51? Total Colons: 3
..code\modules\food&drinks\food\customizables.dm Lines: 37? Total Colons: 1
..code\modules\food&drinks\kitchen machinery\gibber.dm Lines: 165? Total Colons: 1
..code\modules\food&drinks\kitchen machinery\monkeyrecycler.dm Lines: 72? Total Colons: 1
..code\modules\food&drinks\kitchen machinery\processor.dm Lines: 198? Total Colons: 1
..code\modules\games\cards.dm Lines: 177?, 211?, 225? Total Colons: 3
..code\modules\holiday\easter.dm Lines: 77? Total Colons: 1
..code\modules\html_interface\html_interface.dm Lines: 292? Total Colons: 1
..code\modules\hydroponics\grown.dm Lines: 704 Total Colons: 1
..code\modules\hydroponics\growninedible.dm Lines: 71, 194? Total Colons: 2
..code\modules\hydroponics\hydroponics.dm Lines: 642?, 836? Total Colons: 2
..code\modules\hydroponics\seeds.dm Lines: 1377?, 1378? Total Colons: 2
..code\modules\library\lib_items.dm Lines: 186? Total Colons: 1
..code\modules\library\lib_machines.dm Lines: 519 Total Colons: 1
..code\modules\lighting\lighting_system.dm Lines: 254 Total Colons: 1
..code\modules\mob\inventory.dm Lines: 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170 Total Colons: 22
..code\modules\mob\login.dm Lines: 6? Total Colons: 1
..code\modules\mob\mob.dm Lines: 329?, 599?, 690, 756? Total Colons: 5
..code\modules\mob\mob_helpers.dm Lines: 485? Total Colons: 2
..code\modules\mob\transform_procs.dm Lines: 295 Total Colons: 1
..code\modules\mob\dead\observer\observer.dm Lines: 285? Total Colons: 1
..code\modules\mob\living\living.dm Lines: 181?, 359?, 402 Total Colons: 3
..code\modules\mob\living\say.dm Lines: 116? Total Colons: 1
..code\modules\mob\living\carbon\carbon.dm Lines: 114, 286?, 288?, 291?, 310?, 311?, 322?, 323?, 566? Total Colons: 12
..code\modules\mob\living\carbon\life.dm Lines: 468? Total Colons: 1
..code\modules\mob\living\carbon\alien\humanoid\emote.dm Lines: 60? Total Colons: 1
..code\modules\mob\living\carbon\alien\humanoid\humanoid.dm Lines: 93? Total Colons: 2
..code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm Lines: 43?, 46? Total Colons: 2
..code\modules\mob\living\carbon\alien\larva\emote.dm Lines: 79? Total Colons: 1
..code\modules\mob\living\carbon\brain\MMI.dm Lines: 131?, 132? Total Colons: 2
..code\modules\mob\living\carbon\human\examine.dm Lines: 48?, 55?, 62?, 69?, 76?, 83?, 90?, 97?, 115?, 122?, 129?, 136? Total Colons: 12
..code\modules\mob\living\carbon\human\human.dm Lines: 87?, 96?, 192?, 194?, 196?, 200?, 205?, 210?, 215?, 219?, 221?, 223?, 231?, 236?, 241?, 248?, 250?, 252?, 253?, 254?, 324?, 325?, 341?, 563?, 734? Total Colons: 26
..code\modules\mob\living\carbon\human\human_attackalien.dm Lines: 10? Total Colons: 1
..code\modules\mob\living\carbon\human\inventory.dm Lines: 223?, 234?, 238?, 246?, 250?, 254? Total Colons: 6
..code\modules\mob\living\carbon\human\species.dm Lines: 115?, 117?, 126?, 329?, 673? Total Colons: 5
..code\modules\mob\living\carbon\human\update_icons.dm Lines: 112?, 186?, 479? Total Colons: 4
..code\modules\mob\living\carbon\human\whisper.dm Lines: 43? Total Colons: 1
..code\modules\mob\living\carbon\monkey\emote.dm Lines: 60? Total Colons: 1
..code\modules\mob\living\silicon\silicon.dm Lines: 129, 324? Total Colons: 2
..code\modules\mob\living\silicon\ai\ai.dm Lines: 255?, 280?, 281?, 341?, 530?, 532?, 585?, 593? Total Colons: 9
..code\modules\mob\living\silicon\ai\life.dm Lines: 73, 75, 78, 80, 96, 97, 121, 145, 150, 166 Total Colons: 10
..code\modules\mob\living\silicon\ai\say.dm Lines: 15? Total Colons: 2
..code\modules\mob\living\silicon\ai\freelook\eye.dm Lines: 106? Total Colons: 1
..code\modules\mob\living\silicon\pai\pai.dm Lines: 161, 181 Total Colons: 2
..code\modules\mob\living\silicon\pai\software.dm Lines: 220?, 277?, 279?, 281?, 317?, 410?, 415?, 422?, 434, 434?, 435, 436, 436?, 437, 437?, 438, 438?, 439, 439?, 440, 442, 443, 444, 445, 446, 550, 557? Total Colons: 29
..code\modules\mob\living\silicon\robot\examine.dm Lines: 29?, 31? Total Colons: 2
..code\modules\mob\living\silicon\robot\inventory.dm Lines: 54, 62, 70 Total Colons: 3
..code\modules\mob\living\silicon\robot\laws.dm Lines: 47? Total Colons: 1
..code\modules\mob\living\silicon\robot\life.dm Lines: 173, 175, 177 Total Colons: 3
..code\modules\mob\living\silicon\robot\robot.dm Lines: 259?, 393?, 492?, 545?, 806?, 1034? Total Colons: 8
..code\modules\mob\living\simple_animal\parrot.dm Lines: 412?, 414? Total Colons: 2
..code\modules\mob\living\simple_animal\worm.dm Lines: 74? Total Colons: 1
..code\modules\mob\living\simple_animal\friendly\drone\interaction.dm Lines: 103? Total Colons: 2
..code\modules\mob\living\simple_animal\friendly\drone\verbs.dm Lines: 25? Total Colons: 1
..code\modules\mob\living\simple_animal\friendly\drone\_drone.dm Lines: 123?, 130?, 137?, 144? Total Colons: 4
..code\modules\mob\living\simple_animal\hostile\hostile.dm Lines: 255, 256 Total Colons: 4
..code\modules\mob\living\simple_animal\morph\morph.dm Lines: 183? Total Colons: 1
..code\modules\mob\living\simple_animal\slime\death.dm Lines: 15? Total Colons: 1
..code\modules\mob\living\simple_animal\slime\life.dm Lines: 190? Total Colons: 1
..code\modules\mob\living\simple_animal\slime\powers.dm Lines: 75? Total Colons: 1
..code\modules\mob\living\simple_animal\slime\slime.dm Lines: 79?, 80?, 90? Total Colons: 3
..code\modules\mob\new_player\new_player.dm Lines: 27, 29, 44?, 69?, 73? Total Colons: 5
..code\modules\mob\new_player\poll.dm Lines: 12?, 29?, 478? Total Colons: 3
..code\modules\nano\JSON Reader.dm Lines: 71 Total Colons: 2
..code\modules\nano\nanoui.dm Lines: 304? Total Colons: 1
..code\modules\ninja\admin_ninja_verbs.dm Lines: 30, 32 Total Colons: 2
..code\modules\ninja\ninja_event.dm Lines: 141? Total Colons: 1
..code\modules\ninja\suit\gloves.dm Lines: 80?, 87? Total Colons: 2
..code\modules\ninja\suit\mask.dm Lines: 116?, 129?, 132?, 139? Total Colons: 4
..code\modules\ninja\suit\ninjaDrainAct.dm Lines: 128?, 159? Total Colons: 2
..code\modules\ninja\suit\suit.dm Lines: 75?, 79?, 116?, 172? Total Colons: 4
..code\modules\ninja\suit\suit_attackby.dm Lines: 10?, 12?, 19? Total Colons: 3
..code\modules\ninja\suit\suit_initialisation.dm Lines: 84 Total Colons: 1
..code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm Lines: 64, 65, 112?, 131 Total Colons: 4
..code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm Lines: 12? Total Colons: 1
..code\modules\paperwork\filingcabinet.dm Lines: 57? Total Colons: 1
..code\modules\paperwork\folders.dm Lines: 43? Total Colons: 1
..code\modules\paperwork\paper.dm Lines: 86? Total Colons: 1
..code\modules\paperwork\paperbin.dm Lines: 97? Total Colons: 1
..code\modules\paperwork\photocopier.dm Lines: 123?, 264?, 268? Total Colons: 5
..code\modules\paperwork\photography.dm Lines: 66?, 67?, 79?, 183, 184, 189, 190, 217, 217?, 219, 219? Total Colons: 14
..code\modules\power\apc.dm Lines: 128?, 129?, 133, 148, 199?, 201?, 202?, 262?, 454?, 469?, 474, 647, 647?, 664?, 671?, 715?, 838, 839, 840, 1184, 1221? Total Colons: 25
..code\modules\power\cable.dm Lines: 108?, 293?, 564? Total Colons: 3
..code\modules\power\generator.dm Lines: 117? Total Colons: 2
..code\modules\power\gravitygenerator.dm Lines: 230?, 250?, 258?, 264?, 279?, 280?, 287? Total Colons: 7
..code\modules\power\lighting.dm Lines: 261?, 440? Total Colons: 2
..code\modules\power\port_gen.dm Lines: 89?, 273? Total Colons: 2
..code\modules\power\smes.dm Lines: 57, 419? Total Colons: 4
..code\modules\power\solar.dm Lines: 388?, 391? Total Colons: 2
..code\modules\power\turbine.dm Lines: 308?, 365?, 367?, 369? Total Colons: 5
..code\modules\power\antimatter\control.dm Lines: 267? Total Colons: 1
..code\modules\power\antimatter\shielding.dm Lines: 119 Total Colons: 1
..code\modules\power\singularity\collector.dm Lines: 44?, 45?, 46?, 98? Total Colons: 6
..code\modules\power\singularity\emitter.dm Lines: 252? Total Colons: 1
..code\modules\power\singularity\singularity.dm Lines: 117?, 236? Total Colons: 2
..code\modules\power\singularity\particle_accelerator\particle.dm Lines: 42 Total Colons: 1
..code\modules\power\singularity\particle_accelerator\particle_accelerator.dm Lines: 364 Total Colons: 1
..code\modules\power\singularity\particle_accelerator\particle_control.dm Lines: 215?, 216?, 217? Total Colons: 6
..code\modules\procedural mapping\mapGenerator.dm Lines: 153? Total Colons: 1
..code\modules\projectiles\ammunition.dm Lines: 29?, 30?, 155? Total Colons: 3
..code\modules\projectiles\gun.dm Lines: 108?, 110?, 310? Total Colons: 3
..code\modules\projectiles\ammunition\magazines.dm Lines: 173? Total Colons: 1
..code\modules\projectiles\guns\magic\wand.dm Lines: 25? Total Colons: 1
..code\modules\projectiles\guns\projectile\automatic.dm Lines: 28?, 109?, 127?, 160?, 165?, 250? Total Colons: 11
..code\modules\projectiles\guns\projectile\launchers.dm Lines: 49? Total Colons: 1
..code\modules\projectiles\guns\projectile\pistol.dm Lines: 15?, 36? Total Colons: 3
..code\modules\projectiles\guns\projectile\shotgun.dm Lines: 30?, 63?, 114?, 282? Total Colons: 4
..code\modules\projectiles\guns\projectile\toy.dm Lines: 33? Total Colons: 1
..code\modules\reagents\Chemistry-Machinery.dm Lines: 85?, 89, 90, 97, 330?, 350?, 367?, 368?, 512?, 551?, 665?, 705?, 708?, 788, 867?, 910?, 1248?, 1286?, 1508?, 1510?, 1511?, 1512? Total Colons: 24
..code\modules\reagents\Chemistry-Recipes.dm Lines: 46? Total Colons: 1
..code\modules\reagents\reagent_containers.dm Lines: 64? Total Colons: 1
..code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Food-Reagents.dm Lines: 331 Total Colons: 2
..code\modules\reagents\reagent_containers\spray.dm Lines: 97?, 98?, 99?, 177? Total Colons: 4
..code\modules\recycling\disposal-construction.dm Lines: 86?, 91? Total Colons: 2
..code\modules\recycling\disposal-structures.dm Lines: 240? Total Colons: 1
..code\modules\recycling\disposal-unit.dm Lines: 82? Total Colons: 1
..code\modules\recycling\sortingmachinery.dm Lines: 217? Total Colons: 1
..code\modules\research\experimentor.dm Lines: 253? Total Colons: 1
..code\modules\research\message_server.dm Lines: 130? Total Colons: 2
..code\modules\shuttle\shuttle.dm Lines: 266?, 270?, 515?, 522?, 547?, 564? Total Colons: 8
..code\modules\surgery\organs\augments_internal.dm Lines: 33?, 76?, 77?, 94? Total Colons: 4
..code\modules\telesci\telesci_computer.dm Lines: 46?, 122?, 269? Total Colons: 4
..code\modules\tooltip\tooltip.dm Lines: 90? Total Colons: 1
..code\modules\vehicles\VehicleBase.dm Lines: 101?, 103?, 105?, 107? Total Colons: 4
..code\modules\vehicles\VehicleClickInteractions.dm Lines: 128?, 157?, 186?, 214?, 252?, 254?, 257?, 259?, 262?, 264?, 267?, 269?, 272?, 274? Total Colons: 14
..code\modules\vehicles\VehicleDefense.dm Lines: 31? Total Colons: 1
..code\orphaned procs\dbcore.dm Lines: 79? Total Colons: 5
..code\orphaned procs\statistics.dm Lines: 63, 64, 98, 99 Total Colons: 4
..code\_onclick\other_mobs.dm Lines: 89 Total Colons: 1
..code\_onclick\hud\action.dm Lines: 184? Total Colons: 1
..code\_onclick\hud\alien.dm Lines: 90? Total Colons: 1
..code\_onclick\hud\alien_larva.dm Lines: 16? Total Colons: 1
..code\_onclick\hud\human.dm Lines: 59? Total Colons: 1
..code\_onclick\hud\monkey.dm Lines: 17? Total Colons: 1
..code\__DATASTRUCTURES\priority_queue.dm Lines: 33? Total Colons: 1
..code\__DATASTRUCTURES\stacks.dm Lines: 29? Total Colons: 1
..code\__HELPERS\game.dm Lines: 216? Total Colons: 1
..code\__HELPERS\icons.dm Lines: 216?, 233?, 386?, 389?, 392?, 425?, 439?, 456?, 526?, 557?, 559?, 601?, 607?, 635?, 636?, 637?, 638?, 715, 752, 757, 762, 763, 764, 765, 774, 786, 787, 809?, 828?, 839? Total Colons: 38
..code\__HELPERS\icon_smoothing.dm Lines: 176?, 178? Total Colons: 2
..code\__HELPERS\lists.dm Lines: 201?, 206?, 214? Total Colons: 3
..code\__HELPERS\maths.dm Lines: 13?, 18?, 35?, 39? Total Colons: 4
..code\__HELPERS\mobs.dm Lines: 137?, 139?, 140? Total Colons: 11
..code\__HELPERS\names.dm Lines: 63?, 174? Total Colons: 3
..code\__HELPERS\sanitize_values.dm Lines: 34? Total Colons: 1
..code\__HELPERS\text.dm Lines: 157?, 350? Total Colons: 2
..code\__HELPERS\type2type.dm Lines: 68?, 143?, 381? Total Colons: 5
..code\__HELPERS\unsorted.dm Lines: 41?, 573, 904, 991? Total Colons: 4
..code\__HELPERS\sorts\__main.dm Lines: 2?, 57?, 391, 491, 585? Total Colons: 5
433/1564 files have colons in them


code:
# Colon Locater and Reporter, by RemieRichards V1.0 - 25/10/15

# Locates the byond operator ":", which is largely frowned upon due to the fact it ignores any type safety.
# This tool produces a .txt of "filenames line,line?,line totalcolons" (where line? represents a colon in a ternary operation) from all
# .dm files in the /code directory of an SS13 codebase, but can work on any Byond project if you modify scan_dir and real_dir
# the .txt take's todays date in reverse order and adds -colon_operator_log to the end, eg: "2015/10/25-colon_operator_log.txt"

import sys
import os
from datetime import date

#Climbs up from /tools/ColonCatcher and along to ../code
scan_dir = "code" #used later to truncate log file paths
real_dir = os.path.abspath("../../"+scan_dir)

#Scan a directory, scanning any dm files it finds
def colon_scan_dir(scan_dir):
    if os.path.exists(scan_dir):
        if os.path.isdir(scan_dir):

            output_str = ""

            files_scanned = 0
            files_with_colons = 0
            for root, dirs, files in os.walk(scan_dir):
                for f in files:
                    print str(f)
                    scan_result = scan_dm_file(os.path.join(root, f))
                    files_scanned += 1
                    if scan_result:
                        output_str += scan_result+"\n"
                        files_with_colons += 1
            output_str += str(files_with_colons) + "/" + str(files_scanned) + " files have colons in them"

            todays_file = str(date.today())+"-colon_operator_log.txt"
            output_file = open(todays_file, "w") #w so it overrides existing files for today, there should only really be one file per day
            output_file.write(output_str)

#Scan one file, returning a string as a "report" or if there are no colons, False
def scan_dm_file(_file):

    if not _file.endswith(".dm"):
        return False

    with open(_file, "r") as dm_file:
        characters = dm_file.read()

        line_num = 1
        colon_count = 0
        last_char = ""

        in_embed_statement = 0        # [ ... ]  num due to embeds in embeds
        in_multiline_comment = 0      #/* ... */ num due to /* /* */ */
        in_singleline_comment = False #// ... \n
        in_string = False             # " ... "
        ternary_on_line = False       #If there's a ? anywhere on the line, used to report "false"-positives

        lines_with_colons = []

        for char in characters:
            #Line info
            if char == "\n" or char == "\r":
                if not in_string:
                    ternary_on_line = False #Stop any old ternary operation
                    line_num += 1
                    in_embed_statement = 0

            #Not in a comment
            if (not in_singleline_comment) and (in_multiline_comment == 0):
                #Not in a string
                if not in_string:
                    if last_char == "/":
                        if char == "/":
                            in_singleline_comment = True
                        if char == "*":
                            in_multiline_comment += 1
                    if char == "\"":
                        in_string = True

                #In a string
                else:
                    if char == "\"": #Only " ends a string, as byond supports multiline strings
                        if last_char != "\\": #make sure it's a real " not an escaped one (\")
                            in_string = False

                    #It's not an embedded statment if it's not in a string
                    if char == "[":
                        in_embed_statement += 1
                    if char == "]":
                        in_embed_statement -= 1
                        in_embed_statement = max(in_embed_statement,0)

                #ternary statements, True when in_embed_statement+in_string OR when not in_string
                if char == "?":
                    if in_string:
                        if in_embed_statement != 0:
                            ternary_on_line = True
                    else:
                        ternary_on_line = True

                #A Colon!
                #If we're in a string, but not embedded: Ok, it's just rawtext
                #If we're in a string, and embedded but NOT in a ternary operation: Bad, guaranteed to be a : used to avoid typechecks
                #If we're in a string, and embedded AND in a ternary operation: Potentially Bad, this could be a : used to avoid typechecks (bad) or the middle : of the ternary operation (generally ok)

                if char == ":":
                    if not in_string:
                        colon_count += 1
                        data = str(line_num)
                        if ternary_on_line:
                            data += "?"
                        if not data in lines_with_colons: #only add the line twice if it's like: 76, 76? (eg: a "bad" colon and a ternary colon)
                            lines_with_colons.append(data)
                    else:
                        if in_embed_statement != 0:
                            colon_count += 1
                            data = str(line_num)
                            if ternary_on_line:
                                data += "?"
                            if not data in lines_with_colons:
                                lines_with_colons.append(data)

            #In a comment
            else:
                if char == "/":
                    if last_char == "*":
                        in_multiline_comment -= 1
                        in_multiline_comment = max(in_multiline_comment,0)

                if char == "\n" or char == "\r":
                    in_singleline_comment = False

            if char != "": #Spaces aren't useful to us
                last_char = char

        if colon_count:
            file_report = ".."+scan_dir+str(_file).split(scan_dir)[1]+" " #crop it down to ..\code\DIR\FILE.dm, everything else is developer specific

            first = True
            for line in lines_with_colons:
                if first:
                    first = False
                    file_report += "Lines: "+line
                else:
                    file_report += ", "+line

            file_report += " Total Colons: "+str(colon_count)
            return file_report
        else:
            return False

colon_scan_dir(real_dir)
print "Done!"

license: mit


code:
Setup: Unzip the zip files in third_party/ so that you have the directories
third_party/Imaging-1.1.7/ and third_party/zlib/.

Usage: python hitbox_expander.py <path_to_file.dmi or png>

This tool expands the hitbox of the given image by 1 pixel.
Works by changing some of the fully-transparent pixels to alpha=1 black pixels.
Naked human eye usually cannot notice the difference.

No space carps or corgis have been used or injured in the production of this tool.

path: tools/HitboxExpander/README


code:
import os
import sys
import inspect
import shutil

def AddToPath(path):
  if path not in sys.path:
    sys.path.insert(0, path)
    delimeter = ':' if os.name == "posix" else ";"
    os.environ['PATH'] = path + delimeter + os.environ['PATH']

current_dir = os.path.split(inspect.getfile(inspect.currentframe()))[0]

AddToPath(os.path.abspath(os.path.join(current_dir, "third_party/Imaging-1.1.7/PIL")))
AddToPath(os.path.abspath(os.path.join(current_dir, "third_party/zlib")))

import Image
import _imaging

def PngSave(im, file):
  # From http://blog.client9.com/2007/08/28/python-pil-and-png-metadata-take-2.html

  # these can be automatically added to Image.info dict
  # they are not user-added metadata
  reserved = ('interlace', 'gamma', 'dpi', 'transparency', 'aspect')

  # undocumented class
  import PngImagePlugin
  meta = PngImagePlugin.PngInfo()

  # copy metadata into new object
  for k,v in im.info.iteritems():
      if k in reserved: continue
      meta.add_text(k, v, 0)

  # and save
  im.save(file, "PNG", pnginfo=meta)

def ProcessFile(path):
  name, ext = os.path.splitext(path)
  ext = ext.lower()
  if (ext != ".dmi" and ext != ".png") or os.path.splitext(name)[1] == ".new":
    return

  try:
    im = Image.open(path)
    print name + ": " + im.format, im.size, im.mode
    if im.mode != "RGBA":
      return
    width, height = im.size
    pix = im.load()

    n_transparent = 0

    make_opaque = []

    def add(x, y):
      if pix[x, y][3] == 0:
        make_opaque.append((x, y))

    for x in range(0, width):
      for y in range(0, height):
        if pix[x, y][3] > 0:
          if x > 0:
            add(x - 1, y)
          if x < width - 1:
            add(x + 1, y)
          if y > 0:
            add(x, y - 1)
          if y < height - 1:
            add(x, y + 1)
        else:
          n_transparent += 1

    for coords in make_opaque:
      pix[coords] = (0, 0, 0, 1)

    PngSave(im, path)
  except:
    print "Could not process " + name

root_dir = os.path.abspath(os.path.join(current_dir, "../../"))
icons_dir = os.path.join(root_dir, "icons")

def Main():
  if len(sys.argv) != 2:
    print "Usage: hitbox_expander.py filename.dmi"
    return 0

  try:
    with open(sys.argv[1]):
      ProcessFile(os.path.abspath(sys.argv[1]))
      return 0
  except IOError:
    pass

  for root, subdirs, files in os.walk(icons_dir):
    for file in files:
      if file == sys.argv[1]:
        path = os.path.join(root, file)
        ProcessFile(path)
        return 0

  print "File not found: " + sys.argv[1]

if __name__ == "__main__":
  Main()


code:
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MapAtmosFixer", "MapAtmosFixer\MapAtmosFixer.csproj", "{7A901E97-C798-4B17-A9A9-5548C6DCDB56}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|x86 = Debug|x86
		Release|x86 = Release|x86
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{7A901E97-C798-4B17-A9A9-5548C6DCDB56}.Debug|x86.ActiveCfg = Debug|x86
		{7A901E97-C798-4B17-A9A9-5548C6DCDB56}.Debug|x86.Build.0 = Debug|x86
		{7A901E97-C798-4B17-A9A9-5548C6DCDB56}.Release|x86.ActiveCfg = Release|x86
		{7A901E97-C798-4B17-A9A9-5548C6DCDB56}.Release|x86.Build.0 = Release|x86
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
EndGlobal


code:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{7A901E97-C798-4B17-A9A9-5548C6DCDB56}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>MapAtmosFixer</RootNamespace>
    <AssemblyName>MapAtmosFixer</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <PlatformTarget>x86</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <PlatformTarget>x86</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Mapatmosfixer.cs" />
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>


code:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace MapAtmosFixer
{
    internal enum Objtype
    {
        Null,
        Manifold,
        Pump,
        Pipe,
        Scrubber,
        Vent,
        Mixer,
        Filter,
        Injector,
        Temp
    }

    internal static class Mapatmosfixer
    {
        /// <summary>
        ///     Used to make displayed lines shorter.
        /// </summary>
        /// <param name="path">The long path</param>
        /// <param name="masterpath">The path to short with</param>
        /// <returns>Shorted path</returns>
        public static string ShortenPath(string path, ref string masterpath)
        {
            return path.Substring(masterpath.Length, path.Length - masterpath.Length);
        }

        /// <summary>
        ///     Returns true if 'str' starts with 'start'
        /// </summary>
        /// <param name="str">String to test</param>
        /// <param name="start"></param>
        /// <returns></returns>
        public static bool StartsWith(string str, string start)
        {
            if (start.Length > str.Length)
                return false;

            return str.Substring(0, start.Length) == start;
        }

        /// <summary>
        ///     Method to perform a simple regex match.
        /// </summary>
        /// <param name="pattern">Regex pattern</param>
        /// <param name="txt">String to match</param>
        /// <returns>Collection of matches</returns>
        public static GroupCollection Regex(string pattern, string txt)
        {
            var rgx = new Regex(pattern, RegexOptions.IgnoreCase);
            MatchCollection matches = rgx.Matches(txt);

            if (matches.Count == 0)
                return null;

            GroupCollection groups = matches[0].Groups;
            if (groups.Count <= 1)
                return null;

            return groups;
        }

        /// <summary>
        ///     Gets the type of the object in the path
        /// </summary>
        /// <param name="path">String path</param>
        /// <returns></returns>
        public static Objtype GetType(string path)
        {
            if (StartsWith(path, "/obj/machinery/atmospherics/pipe/manifold"))
                return Objtype.Manifold;

            if (StartsWith(path, "/obj/machinery/atmospherics/pipe/simple"))
                return Objtype.Pipe;

            switch (path)
            {
                case "/obj/machinery/atmospherics/binary/pump":
                    return Objtype.Pump;
                case "/obj/machinery/atmospherics/unary/vent_scrubber":
                    return Objtype.Scrubber;
                case "/obj/machinery/atmospherics/unary/vent_pump":
                    return Objtype.Vent;
                case "/obj/machinery/atmospherics/trinary/filter":
                    return Objtype.Filter;
                case "/obj/machinery/atmospherics/trinary/mixer":
                    return Objtype.Mixer;
                case "/obj/machinery/atmospherics/unary/heat_reservoir/heater":
                    return Objtype.Temp;
                case "/obj/machinery/atmospherics/unary/cold_sink/freezer":
                    return Objtype.Temp;
                case "/obj/machinery/atmospherics/unary/outlet_injector":
                    return Objtype.Injector;
                default:
                    return Objtype.Null;
            }
        }

        /// <summary>
        ///     Updates an objects path with its corresponding icon_state
        /// </summary>
        /// <param name="path">Object path to change</param>
        /// <param name="iconstate">Iconstate it has</param>
        /// <param name="objtype">Type of the object</param>
        public static void ProcessIconstate(ref string path, string iconstate, Objtype objtype)
        {
            switch (objtype)
            {
                case Objtype.Pipe:
                    switch (iconstate)
                    {
                        case "intact":
                            path = "/obj/machinery/atmospherics/pipe/simple/general/visible";
                            return;
                        case "intact-f":
                            path = "/obj/machinery/atmospherics/pipe/simple/general/hidden";
                            return;
                        case "intact-b":
                            path = "/obj/machinery/atmospherics/pipe/simple/supply/visible";
                            return;
                        case "intact-b-f":
                            path = "/obj/machinery/atmospherics/pipe/simple/supply/hidden";
                            return;
                        case "intact-r":
                            path = "/obj/machinery/atmospherics/pipe/simple/scrubbers/visible";
                            return;
                        case "intact-r-f":
                            path = "/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden";
                            return;
                        case "intact-y":
                            path = "/obj/machinery/atmospherics/pipe/simple/yellow/visible";
                            return;
                        case "intact-y-f":
                            path = "/obj/machinery/atmospherics/pipe/simple/yellow/hidden";
                            return;
                        case "intact-g":
                            path = "/obj/machinery/atmospherics/pipe/simple/green/visible";
                            return;
                        case "intact-g-f":
                            path = "/obj/machinery/atmospherics/pipe/simple/green/hidden";
                            return;
                        case "intact-c":
                            path = "/obj/machinery/atmospherics/pipe/simple/cyan/visible";
                            return;
                        case "intact-c-f":
                            path = "/obj/machinery/atmospherics/pipe/simple/cyan/hidden";
                            return;
                        case "intact-p":
                            path = "/obj/machinery/atmospherics/pipe/simple/supplymain/visible";
                            return;
                        case "intact-p-f":
                            path = "/obj/machinery/atmospherics/pipe/simple/supplymain/hidden";
                            return;
                    }
                    return;
                case Objtype.Manifold:
                    switch (iconstate)
                    {
                        case "manifold":
                            path = "/obj/machinery/atmospherics/pipe/manifold/general/visible";
                            return;
                        case "manifold-f":
                            path = "/obj/machinery/atmospherics/pipe/manifold/general/hidden";
                            return;
                        case "manifold-b":
                            path = "/obj/machinery/atmospherics/pipe/manifold/supply/visible";
                            return;
                        case "manifold-b-f":
                            path = "/obj/machinery/atmospherics/pipe/manifold/supply/hidden";
                            return;
                        case "manifold-r":
                            path = "/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible";
                            return;
                        case "manifold-r-f":
                            path = "/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden";
                            return;
                        case "manifold-c":
                            path = "/obj/machinery/atmospherics/pipe/manifold/cyan/visible";
                            return;
                        case "manifold-c-f":
                            path = "/obj/machinery/atmospherics/pipe/manifold/cyan/hidden";
                            return;
                        case "manifold-y":
                            path = "/obj/machinery/atmospherics/pipe/manifold/yellow/visible";
                            return;
                        case "manifold-y-f":
                            path = "/obj/machinery/atmospherics/pipe/manifold/yellow/hidden";
                            return;
                        case "manifold-g":
                            path = "/obj/machinery/atmospherics/pipe/manifold/green/visible";
                            return;
                        case "manifold-g-f":
                            path = "/obj/machinery/atmospherics/pipe/manifold/green/hidden";
                            return;
                        case "manifold-p":
                            path = "/obj/machinery/atmospherics/pipe/manifold/supplymain/visible";
                            return;
                        case "manifold-p-f":
                            path = "/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden";
                            return;
                    }
                    return;
            }
        }

        /// <summary>
        ///     Processes one object and its parameters
        /// </summary>
        /// <param name="line"></param>
        public static void ProcessObject(ref string line)
        {
            GroupCollection g = Regex(@"^(.+)\{(.+)\}", line);
            if (g == null)
                return;

            string path = g[1].Value;
            string stringtags = g[2].Value;

            Objtype objtype = GetType(path);
            if (objtype == Objtype.Null)
                return;

            var tags = new List<string>(stringtags.Split(new[] {"; "}, StringSplitOptions.None));
            for (int i = 0; i < tags.Count; i++)
            {
                string tag = tags[i];

                GroupCollection g2 = Regex(@"^(.+)[ ]=[ ](.+)", tag);
                if (g2 == null)
                    continue;

                string name = g2[1].Value;
                string value = g2[2].Value.Trim(new[] {'"'});

                //Removes icon_state from heaters/freezers
                if (objtype == Objtype.Temp)
                {
                    if (name == "icon_state")
                    {
                        tags.RemoveAt(i);
                        i--;
                    }
                    continue;
                }

                //General removal of tags we shouldn't have
                if (name == "pipe_color" || name == "color" || name == "level" ||
                    (objtype != Objtype.Pump && name == "name")
                    || (objtype == Objtype.Pump && name == "icon_state"))
                {
                    tags.RemoveAt(i);
                    i--;
                    continue;
                }

                //Processes icon_state into correct path
                if (name == "icon_state")
                {
                    ProcessIconstate(ref path, value, objtype);
                    tags.RemoveAt(i);
                    i--;
                    continue;
                }

                //Fixes up injector
                if (objtype == Objtype.Injector && name == "on")
                {
                    path = "/obj/machinery/atmospherics/unary/outlet_injector/on";
                    tags.RemoveAt(i);
                    i--;
                }
            }

            stringtags = String.Join("; ", tags);
            line = String.Format("{0}{{{1}}}", path, stringtags);
        }

        /// <summary>
        ///     This fixes connectors to their proper path, if they ain't on plating, they should be visible.
        /// </summary>
        /// <param name="line"></param>
        public static void FixConnector(ref string line)
        {
            //Dirty shit, don't read this
            if (line.Contains("/obj/machinery/atmospherics/portables_connector") &&
                //!line.Contains("/turf/open/floor/plating") &&                        // Most of the time connectors on plating want to be visible..
                !line.Contains("/obj/machinery/atmospherics/portables_connector/visible"))  // Makes sure we don't update same line twice
            {
                line = line.Replace("/obj/machinery/atmospherics/portables_connector",
                    "/obj/machinery/atmospherics/portables_connector/visible");
            }
        }

        /// <summary>
        ///     Processes a line of objects
        /// </summary>
        /// <param name="line"></param>
        public static void ProcessObjectline(ref string line)
        {
            FixConnector(ref line);

            string[] objs = line.Split(',');

            for (int i = 0; i < objs.Length; i++)
            {
                try
                {
                    ProcessObject(ref objs[i]);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }

            line = String.Join(",", objs);
        }

        /// <summary>
        ///     Processes a whole .dmm
        /// </summary>
        /// <param name="file"></param>
        public static void Process(string file)
        {
            string[] lines = File.ReadAllLines(file, Encoding.Default);

            for (int i = 0; i < lines.Length; i++)
            {
                string line = lines[i];

                if (line.Length == 0)
                    continue;

                if (line[0] != '"')
                    continue;

                GroupCollection g = Regex(@"^""([\w]+)""[ ]\=[ ]\((.+)\)", line);
                if (g == null)
                    continue;

                string letters = g[1].Value;
                string types = g[2].Value;
                ProcessObjectline(ref types);

                line = String.Format("\"{0}\" = ({1})", letters, types);

                lines[i] = line;
            }

            File.WriteAllLines(file, lines, Encoding.Default);
        }

        internal static void Init(string file)
        {
            //string exepath = "C:\\Users\\Daniel\\Documents\\GitHub\\-tg-station";
            //string file = "C:\\Users\\Daniel\\Documents\\GitHub\\-tg-station\\_maps\\map_files\\tgstation.2.1.3.dmm";

            Process(file);
            Console.WriteLine("Done");
            Console.Read();
        }
    }
}


code:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace MapAtmosFixer
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Please drag-drop file onto the .exe");
                Console.Read();
                return;
            }

            string file = args[0];
            if (Path.GetExtension(file) != ".dmm")
            {
                Console.WriteLine("File not a map.");
                Console.Read();
                return;
            }

            Mapatmosfixer.Init(file);
        }
    }
}


code:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("MapAtmosFixer")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MapAtmosFixer")]
[assembly: AssemblyCopyright("Copyright ©  2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("87bc6d96-c3ae-4644-ac20-033d8ec401e5")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


code:
A handy tool used to clean up all shit mappers leave behind when doing atmosia code.

Basically it removes most edited variables and instead let the code and object do the work, less hacky shit and everything can be edited in-code without having to edit the map.

How to use:
Drag-n-drop an .dmm onto the compiled .exe
The program will run and then overwrite the same .dmm

Mapmerge tool is not necessary to be run with this.


code:
GitHub pull request announcer bot for IRC
Made by VistaPOWA for the tgstation 13 code project.
This software is licensed under GPL3.
Prequisites: Meebey's SmartIrc4Net library (incl, under GPL)
	   StarkSoft Proxy library (incl, under GPL)
Usage: Edit the config.txt file to match the settings
of your server's. Start the executable. Set up a Github hook
if you hadn't before to send IRC notifications to the
channel of your choosing. Leave it running.
IT IS PREFERABLE IF YOU RAN THIS LOCALLY. YOUR SERVER'S
APICOMMS KEY WILL BE SENT PLAINTEXT! ENSURE THAT THE API
KEY IS NOT PUBLICALLY AVAILABLE! IF LEAKED, CHANGE IT.
Support available @ Rizon's #coderbus, ask for VistaPOWA.


code:
serverip = 127.0.0.1 //SS13 server IP
serverport = 7812 //SS13 server port
commskey = this_is_a_test_key //API key of the server
GitHub_bot_name = testbot_github //It'll get the data from this bot
IRC_bot_name = testbot_BYOND //This'll be our name
IRC_server = irc.rizon.net:6670 //format - server:port
IRC_channel = #ircchannel
Nickserv_auth = _NONE_ //leave _NONE_ if your bot does not require nickserv authentication


code:
serverip = 127.0.0.1 //SS13 server IP
serverport = 1337 //SS13 server port
commskey = fill_your_own_in //API key of the server
GitHub_bot_name = TheGhostOfWhibyl1 //It'll get the data from this bot
IRC_bot_name = PR_Listener_Bot //This'll be our name
IRC_server = irc.rizon.net:6670 //format - server:port
IRC_channel = #coderbus
Nickserv_auth = _NONE_ //leave _NONE_ if your bot does not require nickserv authentication


code:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "sendkeys_ss13", "sendkeys_ss13\sendkeys_ss13.csproj", "{5D939FCB-F326-4B9B-8CEC-B2538126392E}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{5D939FCB-F326-4B9B-8CEC-B2538126392E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{5D939FCB-F326-4B9B-8CEC-B2538126392E}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{5D939FCB-F326-4B9B-8CEC-B2538126392E}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{5D939FCB-F326-4B9B-8CEC-B2538126392E}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
EndGlobal


code:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>

    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>


code:
//////////////////////////////////////////////////////////////////
/////GitHub pull request announcer bot for IRC////////////////////
/////Made by VistaPOWA for the /tg/station 13 code project.///////
/////This software is licensed under GPL3.////////////////////////
/////Prequisites: Meebey's SmartIrc4Net library (incl, under GPL)/
/////             StarkSoft Proxy library (incl, under GPL)///////
/////Usage: Edit the config.txt file to match the settings////////
/////of your server's. Start the executable. Set up a Github hook/
/////if you hadn't before to send IRC notifications to the////////
/////channel of your choosing. Leave it running.//////////////////
/////IT IS PREFERABLE IF YOU RAN THIS LOCALLY. YOUR SERVER'S//////
/////API/COMMS KEY WILL BE SENT PLAINTEXT! ENSURE THAT THE API////
/////KEY IS NOT PUBLICALLY AVAILABLE! IF LEAKED, CHANGE IT.///////
/////Support available @ Rizon's #coderbus, ask for VistaPOWA.////
//////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Meebey.SmartIrc4net;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace sendkeys_ss13
{
    public class Program
    {
        //default values
        public static string serverIP = "127.0.0.1";
        public static int serverPort = 11111;
        public static string commskey = "this_is_a_test_key";
        public static string Github_bot_name = "testbot_github";
        public static string IRC_bot_name = "testbot";
        public static string IRC_server = "test.net";
        public static int IRC_port = 11111;
        public static string IRC_channel = "#channel";
        public static string NickServAuth = null;

        public static string[] merge_archive;
        public static bool mergeflag = false;
        public static string mergedPR = "";
        public static string lastPR = "";

        public static IrcClient irc = new IrcClient();

        public static int IRCReconnectAttempt = 0;
        public static void Main(string[]args)
        {
            ReadConf();
            irc.OnChannelMessage += new IrcEventHandler(OnChannelMessage);
            irc.SupportNonRfc = true;
            try
            {
                irc.Connect(IRC_server, IRC_port);
                IRCReconnectAttempt = 0;
            }
            catch (Exception)
            {
                IRCReconnectAttempt++;
                if (IRCReconnectAttempt <= 5)
                {
                    Console.WriteLine("IRC server is unavaible at the moment. Reconnect attempt {0}...", IRCReconnectAttempt);
                    System.Threading.Thread.Sleep(5000); //Reconnecting after 5 seconds.
                    Main(args);
                }
                else
                {
                    Console.WriteLine("IRC server unreachable. Please check your configuration file.");
                    Console.ReadLine();
                    return;
                }
            }
            Console.WriteLine("Connected to IRC");
            try
            {
                irc.Login(IRC_bot_name, IRC_bot_name);
            }
            catch (Exception)
            {
                irc.Login(IRC_bot_name + "_1", IRC_bot_name + "_1");
                Console.WriteLine("Bot name is already taken, trying alternate...");
            }
            if (NickServAuth != null)
                irc.SendMessage(SendType.Message, "NickServ", "identify " + NickServAuth);
            Console.WriteLine("Logged in");
            irc.RfcJoin(IRC_channel);
            Console.WriteLine("Joining {0}", IRC_channel);
            irc.Listen();
        }

        public static void ReadConf()
        {
            if (File.Exists("config.txt"))
            {
                StreamReader reader = new StreamReader("config.txt");
                string[] line = ReadLine_exception(reader);
                if (line[2] != null)
                {
                    Match match1 = Regex.Match(line[2], @"^(\d{1,3}.?){4}$"); //rudimentary IP validation
                    if (match1.Success)
                    {
                        serverIP = line[2];
                        Console.WriteLine("Read IP: " + serverIP);
                    }
                    else
                    {
                        Console.WriteLine("IP cannot be validated.");
                    }
                }
                line = ReadLine_exception(reader);
                if (line[2] != null)
                {
                    Match match2 = Regex.Match(line[2], @"^\d{1,5}$"); //rudimentary port validation
                    if (match2.Success && (Convert.ToInt32(line[2]) < 65535))
                    {
                        serverPort = Convert.ToInt32(line[2]);
                        Console.WriteLine("Read port: " + serverPort);
                    }
                    else
                    {
                        Console.WriteLine("Port cannot be validated.");
                    }
                }
                line = ReadLine_exception(reader);
                if (line[2] != null)
                {
                    commskey = line[2];
                    Console.WriteLine("Commskey read.");
                }
                else
                {
                    Console.WriteLine("No Commskey!");
                }
                line = ReadLine_exception(reader);
                if (line[2] != null)
                {
                    Github_bot_name = line[2];
                    Console.WriteLine("Read Github bot name: " + Github_bot_name);
                }
                else
                {
                    Console.WriteLine("No botname found.");
                }
                line = ReadLine_exception(reader);
                if (line[2] != null)
                {
                    IRC_bot_name = line[2];
                    Console.WriteLine("Read IRC bot name: " + IRC_bot_name);
                }
                else
                {
                    Console.WriteLine("No botname found.");
                }
                line = ReadLine_exception(reader);
                if (line[2] != null)
                {
                    Match match3 = Regex.Match(line[2], @"^(.+)\:(\d{1,5})$"); //rudimentary port validation
                    if (match3.Success)
                    {
                        IRC_server = Convert.ToString(match3.Groups[1]);
                        Int32.TryParse(Convert.ToString(match3.Groups[2]), out IRC_port);
                        Console.WriteLine("Read IRC server: " + IRC_server + ":" + Convert.ToString(IRC_port));
                    }
                    else
                    {
                        Console.WriteLine("Server:port invalid.");
                    }
                }
                line = ReadLine_exception(reader);
                if (line[2] != null)
                {
                    IRC_channel = line[2];
                    Console.WriteLine("Read channel: " + IRC_channel);
                }
                else
                {
                    Console.WriteLine("No channel found.");
                }
                line = ReadLine_exception(reader);
                if (line[2] != null && line[2] != "_NONE_")
                {
                    NickServAuth = line[2];
                    Console.WriteLine("Read Nickserv auth");
                }
                else
                {
                    Console.WriteLine("No NickServ auth chosen.");
                }
                reader.Close();
            }
            else
            {
                Console.WriteLine("Config file doesn't exist, using defaults");
                return;
            }
        }

        private static string[] ReadLine_exception(StreamReader reader)
        {
            string[] readline = null;
            try
            {
                readline = reader.ReadLine().Split(' ');
            }
            catch (Exception)
            {
                readline[3] = "Error, couldn't read all lines of config file! Are you sure the config file has the right format?";
                return readline;
            }
            return readline;
        }

        public static void OnChannelMessage(object sender, IrcEventArgs e)
        {
            if (e.Data.Nick == Github_bot_name)
            {
                    string[] msg = e.Data.Message.Split(' ');
                    for (int i = 0; i < msg.Length; i++)
                    {
                        msg[i] = Regex.Replace(msg[i], @"[\x02\x1F\x0F\x16]|\x03(\d\d?(,\d\d?)?)?", String.Empty); //Sanitizing color codes
                        msg[i] = Regex.Replace(msg[i], @"[\\\&\=\;\<\>]", " "); //Filtering out some iffy characters
                    }
                    FormMessage(msg);
            }
        }
        private static void FormMessage(string[] msg, bool ShortenedURL = false)
        {
            using (StreamWriter output = new StreamWriter("output.txt"))
            {
                if (msg.Length >= 4)
                {
                    if (msg[3] == "Merge" && msg[1] != "meant:") //Someone is merging something
                    {
                        mergedPR = msg[6];
                        if (merge_archive != null)
                        {
                            string currentPR = merge_archive[5].Substring(0, merge_archive[5].Length - 1); //PR no. without : at the end
                            if (currentPR == mergedPR && currentPR != lastPR) //Check if the last closed message's PR number is the same PR number as the merge one.
                            {
                                mergeflag = true;
                                msg = merge_archive;
                                msg[2] = "merged";
                                lastPR = mergedPR;
                                mergedPR = null;
                                merge_archive = null;
                            }
                        }
                    }
                    if (msg[2] == "closed" && msg[1] != "meant:")
                    {
                        merge_archive = msg;
                        if (mergedPR != null)
                        {
                            string currentPR = msg[5].Substring(0, msg[5].Length - 1);
                            if (currentPR == mergedPR && currentPR != lastPR) //Check if the current closed message's PR number
                            {
                                mergeflag = true;
                                msg[2] = "merged";
                                lastPR = mergedPR;
                                mergedPR = null;
                                merge_archive = null;
                            }
                        }
                    }
                    if ((msg[2] == "opened" || mergeflag) && msg[1] != "meant:") //Either we open a new PR or a PR was closed in the last message. Also protection from Whibyl's correction thingy!
                    {
                        mergeflag = false;
                        string URL = msg[msg.Length - 1];
                        if (!ShortenedURL)
                            URL = ShortenURL(URL);
                        msg[5] = "" + msg[5] + "";
                        msg[0] = ""; //Repo name
                        msg[msg.Length - 1] = ""; //The URL itself
                        msg[msg.Length - 2] = ""; //Branch info
                        byte[] PACKETS = CreatePacket(msg);
                        PACKETS[1] = 0x83;
                        int len = 0;
                        for (int i = 1; i < msg.Length - 1; i++)
                        {
                            len += msg[i].Length + 1; //The length of the word and the space following it.
                            Console.Write(msg[i] + " ");
                        }
                        len -= 1; //Compensating for the lack of space at the end.
                        len += 14 + commskey.Length + 6; //Argument names + Commskey length + 6 null bytes
                        PACKETS[3] = (byte)len;
                        StringBuilder test = new StringBuilder();
                        for (int i = 0; i < PACKETS.Length; i++)
                        {
                            test.Append(Convert.ToString(PACKETS[i]));
                        }
                        output.WriteLine(Convert.ToString(test));
                        SendPacket(output, PACKETS);
                    }
                }
            }
        }

        public static int ServerReconnectAttempt = 0;
        private static void SendPacket(StreamWriter output, byte[] PACKETS)
        {
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
            try
            {
                server.Connect(ip);
                server.Send(PACKETS);
                Console.WriteLine("- sent ;)");
                ServerReconnectAttempt = 0;
                output.Close();
                Console.WriteLine();
            }
            catch (Exception)
            {
                ServerReconnectAttempt++;
                if(ServerReconnectAttempt <= 5)
                {
                    Console.WriteLine("Server is not available at the moment. Reconnect attempt {0}...", ServerReconnectAttempt);
                    System.Threading.Thread.Sleep(15000); //Reconnecting after 15 seconds.
                    SendPacket(output, PACKETS);
                }
                else
                {
                    output.Close();
                    Console.WriteLine("Server appears to be down for good. Press ENTER when you have restarted the server to continue.");
                    Console.ReadLine();
                    ServerReconnectAttempt = 0;
                    SendPacket(output, PACKETS);
                }
            }
        }

        public static int GitReconnectAttempt = 0;
        private static string ShortenURL(string URL) //derived from GitIoSharp by dimapasko
        {
            WebRequest request = WebRequest.Create("http://git.io");
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";
            byte[] packet = Encoding.ASCII.GetBytes("url=" + URL);
            request.ContentLength = packet.Length;
            try
            {
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(packet, 0, packet.Length);
                    GitReconnectAttempt = 0;
                }
            }
            catch (Exception)
            {
                GitReconnectAttempt++;
                if (GitReconnectAttempt <= 3)
                {
                    Console.WriteLine("Git.IO is not available at the moment. Reconnect attempt {0}...", GitReconnectAttempt);
                    System.Threading.Thread.Sleep(3000); //Attempt to reconnect after 3 seconds.
                    ShortenURL(URL);
                }
                else
                {
                    Console.WriteLine("Git.IO is down. Returning long URL.");
                    GitReconnectAttempt = 0; //Reset counter
                    return URL;
                }
            }

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            return Convert.ToString(new Uri(response.Headers[HttpResponseHeader.Location]));
        }

        private static byte[] CreatePacket(string[] msg)
        {
            StringBuilder packet = new StringBuilder();
            packet.Append((char)'\x00', 8); //packet[1] is 0x83, packet[3] contain length
            packet.Append("?announce=");
            for (int i = 1; i < msg.Length - 1; i++)
            {
                if(i == msg.Length - 2)
                    packet.Append(msg[i]);
                else
                    packet.Append(msg[i] + " ");
            }
            packet.Append("&key=");
            packet.Append(commskey);
            packet.Append((char)'\x00');
            return Encoding.ASCII.GetBytes(packet.ToString());
        }
    }
}


code:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("sendkeys_ss13")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("sendkeys_ss13")]
[assembly: AssemblyCopyright("Copyright ©  2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("197641d3-a97a-4255-b833-d6481ca4ef54")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


code:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{5D939FCB-F326-4B9B-8CEC-B2538126392E}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>sendkeys_ss13</RootNamespace>
    <AssemblyName>sendkeys_ss13</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkProfile />
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="Meebey.SmartIrc4net">
      <HintPath>.\Meebey.SmartIrc4net.dll</HintPath>
    </Reference>
    <Reference Include="StarkSoftProxy">
      <HintPath>.\StarkSoftProxy.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <None Include="App.config" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="IrcDotNet.dll" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>


code:
/*
	Written by contributor Doohl for the /tg/station Open Source project, hosted on Google Code.
	(2012)
 */

var/list/config_stream = list()
var/list/servers = list()
var/list/servernames = list()
var/list/adminfiles = list()
var/list/adminkeys = list()

proc/gen_configs()

	config_stream = dd_file2list("config.txt")

	var/server_gen = 0	// if the stream is looking for servers
	var/admin_gen = 0	// if the stream is looking for admins
	for(var/line in config_stream)

		if(line == "\[SERVERS\]")
			server_gen = 1
			if(admin_gen)
				admin_gen = 0

		else if(line == "\[ADMINS\]")
			admin_gen = 1
			if(server_gen)
				server_gen = 0

		else
			if(findtext(line, ".") && !findtext(line, "##"))
				if(server_gen)
					var/filterline = dd_replacetext(line, " ", "")
					var/serverlink = copytext(filterline, findtext( filterline, ")") + 1)
					servers.Add(serverlink)
					servernames.Add( copytext(line, findtext(line, "("), findtext(line, ")") + 1))

				else if(admin_gen)
					adminfiles.Add(line)
					world << line

	// Generate the list of admins now

	for(var/file in adminfiles)
		var/admin_config_stream = dd_file2list(file)

		for(var/line in admin_config_stream)

			var/akey = copytext(line, 1, findtext(line, " "))
			adminkeys.Add(akey)


code:
// DM Environment file for Redirect_Tgstation.dme.
// All manual changes should be made outside the BEGIN_ and END_ blocks.
// New source code should be placed in .dm files: choose File/New --> Code File.

// BEGIN_INTERNALS
// END_INTERNALS

// BEGIN_FILE_DIR
#define FILE_DIR .
// END_FILE_DIR

// BEGIN_PREFERENCES
// END_PREFERENCES

// BEGIN_INCLUDE
#include "Configurations.dm"
#include "Redirector.dm"
#include "textprocs.dm"
#include "skin.dmf"
// END_INCLUDE


code:
/*
	Written by contributor Doohl for the /tg/station Open Source project, hosted on Google Code.
	(2012)
 */

/* TODO: work on server selection for detected admins */

#define ADMINS 1
#define PLAYERS 0

var/player_weight = 1 // players are more likely to join a server with less players
var/admin_weight = 5 // admins are more likely to join a server with less admins

var/player_substr = "players=" // search for this substring to locate # of players
var/admin_substr  = "admins=" // search for this to locate # of admins

world
	name = "TGstation Redirector"

world/New()
	..()
	gen_configs()

/datum/server
	var/players = 0
	var/admins = 0
	var/weight = 0 // lower weight is good; highet weight is bad

	var/link = ""

mob/Login()
	..()

	var/list/weights = list()
	var/list/servers = list()
	for(var/x in global.servers)

		world << "[x] [servernames[ global.servers.Find(x) ]]"

		var/info = world.Export("[x]?status")
		var/datum/server/S = new()
		S.players = extract(info, PLAYERS)
		S.admins = extract(info, ADMINS)

		S.weight += player_weight * S.players
		S.link = x

		world << S.players
		world << S.admins

		weights.Add(S.weight)
		servers.Add(S)

	var/lowest = min(weights)
	var/serverlink
	for(var/datum/server/S in servers)
		if(S.weight == lowest)
			serverlink = S.link

	src << link(serverlink)

proc/extract(var/data, var/type = PLAYERS)

	var/nextpos = 0

	if(type == PLAYERS)

		nextpos = findtextEx(data, player_substr)
		nextpos += length(player_substr)

	else

		nextpos = findtextEx(data, admin_substr)
		nextpos += length(admin_substr)

	var/returnval = ""

	for(var/i = 1, i <= 10, i++)

		var/interval = copytext(data, nextpos + (i-1), nextpos + i)
		if(interval == "&")
			break
		else
			returnval += interval

	return returnval


code:
[SERVERS]
## Simply enter a list of servers to poll. Be sure to specify a server name in parentheses.

(Sibyl #1) byond://game.nanotrasen.com:1337

(Sibyl #2) byond://game.nanotrasen.com:2337

[ADMINS]
## Specify some standard Windows filepaths (you may use relative paths) for admin txt lists to poll.

C:\SS13\config\admins.txt


code:
macro "macro"
	elem
		name = "North+REP"
		command = ".north"
		is-disabled = false
	elem
		name = "South+REP"
		command = ".south"
		is-disabled = false
	elem
		name = "East+REP"
		command = ".east"
		is-disabled = false
	elem
		name = "West+REP"
		command = ".west"
		is-disabled = false
	elem
		name = "Northeast+REP"
		command = ".northeast"
		is-disabled = false
	elem
		name = "Northwest+REP"
		command = ".northwest"
		is-disabled = false
	elem
		name = "Southeast+REP"
		command = ".southeast"
		is-disabled = false
	elem
		name = "Southwest+REP"
		command = ".southwest"
		is-disabled = false
	elem
		name = "Center+REP"
		command = ".center"
		is-disabled = false

menu "menu"
	elem
		name = "&Quit"
		command = ".quit"
		category = "&File"
		is-checked = false
		can-check = false
		group = ""
		is-disabled = false
		saved-params = "is-checked"

window "window"
	elem "window"
		type = MAIN
		pos = 281,0
		size = 594x231
		anchor1 = none
		anchor2 = none
		font-family = ""
		font-size = 0
		font-style = ""
		text-color = #000000
		background-color = #000000
		is-visible = false
		is-disabled = false
		is-transparent = false
		is-default = true
		border = none
		drop-zone = false
		right-click = false
		saved-params = "pos;size;is-minimized;is-maximized"
		on-size = ""
		title = ""
		titlebar = true
		statusbar = false
		can-close = true
		can-minimize = true
		can-resize = true
		is-pane = false
		is-minimized = false
		is-maximized = false
		can-scroll = none
		icon = ""
		image = ""
		image-mode = stretch
		keep-aspect = false
		transparent-color = none
		alpha = 255
		macro = "macro"
		menu = ""
		on-close = ""
	elem "servers"
		type = GRID
		pos = 8,8
		size = 576x152
		anchor1 = none
		anchor2 = none
		font-family = ""
		font-size = 0
		font-style = ""
		text-color = #ffffff
		background-color = #000000
		is-visible = true
		is-disabled = false
		is-transparent = false
		is-default = false
		border = none
		drop-zone = true
		right-click = false
		saved-params = ""
		on-size = ""
		cells = 1x1
		current-cell = 1,1
		show-lines = none
		small-icons = true
		show-names = true
		enable-http-images = false
		link-color = #0000ff
		visited-color = #ff00ff
		line-color = #c0c0c0
		style = ""
		is-list = false
	elem "output1"
		type = OUTPUT
		pos = 8,168
		size = 576x56
		anchor1 = none
		anchor2 = none
		font-family = ""
		font-size = 0
		font-style = ""
		text-color = #ffffff
		background-color = #000000
		is-visible = true
		is-disabled = false
		is-transparent = false
		is-default = true
		border = none
		drop-zone = false
		right-click = false
		saved-params = "max-lines"
		on-size = ""
		link-color = #0000ff
		visited-color = #ff00ff
		style = ""
		enable-http-images = false
		max-lines = 1000
		image = ""