bsp_tool provides a Command Line Interface for analysing .bsp files

Overview

bsp_tool

Python library for analysing .bsp files

bsp_tool provides a Command Line Interface for analysing .bsp files
Current development is focused on bringing new maps to Counter-Strike: Online 2 & the Titanfall Engine

Installation

To use the latest version, clone from git:

$ git clone [email protected]:snake-biscuits/bsp_tool.git

Or to use the latest stable release, install via pip (Python 3.7+):

pip install bsp_tool

Fair Use

Please do not use bsp_tool to copy or steal another creator's work
The primary goal of bsp_tool is to extend community mapping tools

Always

  • Ask the creator's permission before touching their work
  • Understand that by default creator's works are under copyright
  • Contact the original creator to get their permission
    • This can get complicated
    • Some creators don't hold the copyright on their works
      • often because of Company / Publisher contracts
  • Credit the original creator; once you have permission to share a derivative work
  • Support the official release

DO NOT use this tool to steal another creator's work
DO use this tool to understand the .bsp format(s) and create more specific tools

Be aware that this gets even more complicated with commercial projects

Usage

To load a .bsp file in python:

">
>>> import bsp_tool
>>> bsp_tool.load_bsp("map_folder/filename.bsp")
<ValveBsp filename.bsp (VBSP version 20) at 0x00...>

Full documentation: snake-biscuits.github.io/bsp_tool/

Supported Games

The emoji indicates tests are failing
The emoji indicates a lack of .bsps to test

Thanks

  • BobTheBob
    • Identified loads of Titanfall lumps (90% of static props + more)
  • Chris Strahl
    • Preserving extensive documentation, mods & source code for Quake 3 & Ubertools games
  • Ficool2
    • Providing lots of current and detailed info on Source & helping track down some rarer titles
  • Maxime Dupuis
    • Helping me identify multiple lumps in Source Engine .bsps
  • MobyGames
    • Keeping records of the credits on so many games, helping to pin down engine origins
  • pakextract
    • Super useful tool for .pak files
  • REDxEYE
    • Being very open and actively collaborating on SourceIO & Titanfall .bsps
  • Taskinoz
    • Helping me find people that can actively use my research & tools
  • All of the Wiki Editors
    • Except the uncited Id Tech 3 -> Treyarch NGL on CoDWiki, that was a massive pain to verify
Comments
  • Refactor to allow reloading lumps

    Refactor to allow reloading lumps

    When mapping out methods / lump formats it would be quite handy to use importlib to reload branch scripts and reload a single lump

    >>> import bsp_tool
    >>> import my_branch_script
    >>> bsp = bsp_tool.load_bsp("maps/subject.bsp", branch=my_branch_script)
    ERROR LOADING LUMP_XX:
    	...
    # edit my_branch_script.py
    >>> import importlib
    >>> importlib.reload(my_branch_script)
    >>> bsp.set_branch(my_branch_script)
    >>> bsp.reload("LUMP_XX")
    

    or even writing a test lump class live in editor

    >>> import bsp_tool
    >>> import enum
    >>> class BranchScript:
    ...    class LUMP(enum.Enum):
    ...        LUMP_XX = 42
    ...    lump_header_address = {LUMP.LUMP_XX: (16 + 42 * 16)}
    ...    LUMP_CLASSES = dict()
    ...    SPECIAL_LUMP_CLASSES = dict()
    ...    methods = []
    >>> branch_script = BranchScript()
    >>> class Xx(bsp_tool.branches.base.MappedArray):
    ...     _format = "3f"
    ...     _mapping = [*"xyz"]
    >>> branch_script.LUMP_CLASSES["LUMP_XX"] = Xx
    >>> bsp = bsp_tool.load_bsp("maps/subject.bsp", branch=branch_script)
    ERROR LOADING LUMP_XX
    	...
    >>> class NewXx(bsp_tool.branches.base.MappedArray):
    ...     _format = "4f"
    ...     _mapping = [*"xyzw"]
    >>> bsp.branch.LUMP_CLASSES["LUMP_XX"] = NewXx
    >>> bsp.reload("LUMP_XX")
    

    Though even this theorised process could be simplified a little, but loading new lump classes faster would be a very helpful tool

    enhancement 
    opened by snake-biscuits 4
  • Is 29 (LUMP_PHYSCOLLIDE) really unused?

    Is 29 (LUMP_PHYSCOLLIDE) really unused?

    https://github.com/snake-biscuits/bsp_tool/blob/56c425188073178d7d605c15b24be8e691ca831f/bsp_tool/branches/respawn/apex_legends.py#L53

    Appears this is unused, but I'm not sure if that was just put there in a haste or is actually reality. I could not find any information on LUMP_PHYSLEVEL which I suspect may be the alternative lump which holds collision data.

    opened by lf94 4
  • BitFields are busted in places

    BitFields are busted in places

    Keep forgetting about the reverse order needed since we're matching gcc bitfield order I have no idea how/if bitfield order is standardised, and I fear endian flipped bitfields

    Testing apex_legends.BVHNode index bitfields gave some wierd errors

    >>> base.BitField(0xAAAAAABC, _format="I", _fields={"a": 24, "b": 4, "c": 4})
    Traceback (most recent call last):
      ...
    OverflowError: a is out of range! (max allowed value = 16777215)
    >>> 0XFFFFFFFF == (2 ** 32) - 1
    True
    >>> 0xAAAAAA < (2 ** 24) - 1
    True
    >>> 0xAAAABC < (2 ** 24) - 1
    True
    >>> bsp_tool.branches.base.BitField(0xAAAAAABC, _format="I", _fields={"a": 24, "b": 4, "c": 4})
    Traceback (most recent call last):
      ...
    OverflowError: a is out of range! (max allowed value = 16777215)
    >>> bsp_tool.branches.base.BitField(0x00000123, _format="I", _fields={"a": 24, "b": 4, "c": 4})
    <BitField (a: 291, b: 0, c: 0)>
    >>> bsp_tool.branches.base.BitField(0x00000123, _format="I", _fields={"c": 4, "b": 4, "a": 24})
    Traceback (most recent call last):
      ...
    OverflowError: c is out of range! (max allowed value = 15)
    >>> 0x123 >> 24
    0
    >>> (0x123 >> 24) & 0xFFFFFF
    0
    

    __init__ shouldn't be throwing bounds errors, there should be a mask keeping us in bounds... will need to expand tests for regression as well

    bug 
    opened by snake-biscuits 3
  • Any progress on save_as() function ?

    Any progress on save_as() function ?

    I am working on a program which automatically adds an eventlistener to any given csgo .bsp file. I have already made a progress on adding the entities to the bsp and the only thing left is to save the map to a new bsp file. I just wanted to know if any progress was made in the past 4 months ?

    enhancement 
    opened by miifanboy 3
  • Cannot load entities lump

    Cannot load entities lump

    I made a small script to play around with bsp_tool:

    from bsp_tool import load_bsp
    from bsp_tool.branches.respawn.apex_legends import LUMP
    
    file = "/home/lee/Code/Mine/Analysis/ApexLegends/Maps/KingsCanyon/mp_rr_canyonlands_staging.bsp"
    bsp = load_bsp(file)
    bsp.read_lump(LUMP.ENTITIES)
    

    Note I do have the ...0000.bsp_lump.

    But I'm unable to retrieve the entities lump:

    $ python3 test.py
    Loading mp_rr_canyonlands_staging.bsp (rBSP version 49)...
    ERROR PARSING TEXDATA:
    TEXDATA lump is an unusual size (400 / 36). Wrong engine branch?
    Loaded  mp_rr_canyonlands_staging.bsp
    Traceback (most recent call last):
      File "/home/lee/Code/Others/bsp_tool/test.py", line 6, in <module>
        bsp.read_lump(LUMP.ENTITIES)
      File "/home/lee/Code/Others/bsp_tool/bsp_tool/respawn.py", line 29, in read_lump
        self.file.seek(self.branch.lump_header_address[LUMP])
    ValueError: seek of closed file
    

    After this I'm going to probably export the vertices to see some point clouds (as you've done in lump_analysis.py).

    Have you gotten chunks of the level to render with planes? Do you know how LOD is handled?

    bug 
    opened by lf94 3
  • Can't peek lumps with dot notation

    Can't peek lumps with dot notation

    Shouldn't use setattr imo, as there is no type hinting on what sorts of lumps a bsp contains. https://github.com/snake-biscuits/bsp_tool/blob/2a3e1e7d10a6d94c7686b2799d3c7c2db898b4b6/bsp_tool/valve.py#L57

    documentation 
    opened by kristiker 2
  • [Test Maps] `orange_box`

    [Test Maps] `orange_box`

    • [x] Tools:

      • Source SDK
      • Source SDK Base 2006
      • Source SDK Base 2007
      • [x] Level Editor(s):
      • [x] Compiler(s): Source SDK
    • [x] Map(s):

      • [x] mapsrc/Hammer/Team Fortress 2/test2.vmf ->maps/Team Fortress 2/test2.bsp
        • [x] sources.txt crediting mapper(s) / contributor(s)
        • [x] compiled
        • [x] .bsp.info.txt file with bspinfo output
        • [x] tested
      • [x] mapsrc/Hammer/Team Fortress 2/test_displacement_decompile.vmf ->maps/Team Fortress 2/test_displacement_decompile.bsp
        • [x] sources.txt crediting mapper(s) / contributor(s)
        • [x] compiled
        • [x] .bsp.info.txt file with bspinfo output
        • [x] tested
      • [x] mapsrc/Hammer/Team Fortress 2/test_physcollide.vmf ->maps/Team Fortress 2/test_physcollide.bsp
        • [x] sources.txt crediting mapper(s) / contributor(s)
        • [x] compiled
        • [x] .bsp.info.txt file with bspinfo output
        • [x] tested
      • [x] mapsrc/Hammer++/Team Fortress 2/mp_lobby.vmf -> maps/Team Fortress 2/mp_lobby.bsp
        • [x] sources.txt crediting mapper(s) / contributor(s)
        • [x] compiled
        • [x] .bsp.info.txt file with bspinfo output
        • [x] tested

    Active Mods / Modding Community (Optional):

    Test Map Test Map: Tools: Hammer 
    opened by snake-biscuits 2
  • [Test Maps] `quake2`

    [Test Maps] `quake2`

    • [x] Tools:

      • Documentation / Guides:
        • TODO: see #30 for now
    • [x] Map(s):

      • [x] Basic room with spawnpoint & lighting mapsrc/TrenchBroom/Quake/mp_lobby.map -> maps/Quake 2/mp_lobby.bsp
        • [x] sources.txt crediting mapper / contributor
        • [x] Compiled
        • [x] .bsp.info.txt file with compile log
        • [x] Tested

    Active Mods / Modding Community (Optional):

    • TODO: see #30 for now
    Test Map Test Map: Tools: Trenchbroom Test Map: Tools: Obscure 
    opened by snake-biscuits 2
  • [Test Maps] `quake`

    [Test Maps] `quake`

    • [x] Tools:

      • Documentation / Guides:
        • TODO: see #30 for now
    • [x] Map(s):

      • [x] Basic room with spawnpoint & lighting mapsrc/TrenchBroom/Quake/mp_lobby.map -> maps/Quake/mp_lobby.bsp
        • [x] sources.txt crediting mapper / contributor
        • [x] Compiled
        • [x] .bsp.info.txt file with compile log
        • [x] Tested

    Active Mods / Modding Community (Optional):

    • TODO: see #30 for now
    Test Map Test Map: Tools: Trenchbroom 
    opened by snake-biscuits 2
  • Need helper class for Bitfields in Struct & MappedArray classes

    Need helper class for Bitfields in Struct & MappedArray classes

    Thanks Fifty.

    struct CellAABBNode_t {
        Vector3f  mins;
        uint32_t  num_children: 8;
        uint32_t  first_child: 16;
        uint32_t  child_flags: 8;
        Vector3f  maxs;
        uint32_t  num_obj_refs: 8;
        uint32_t  first_obj_ref: 16;
        uint32_t  obj_ref_flags: 8;
    };
    

    Looks like respawn structs use bitfields a lot This makes sense with the "Extreme SIMD" method of vec4(a.xyz, a.metadata)

    valve.source.Leaf also uses a bitfield at present we just write a getter & setter property for each member

    This means CellAABBNode would need 12 property methods Automating this would minimize errors & reduce bloat

    enhancement 
    opened by snake-biscuits 2
  • Entity data lost due to duplicate keys not being handled by parser

    Entity data lost due to duplicate keys not being handled by parser

    Duplicate keys in entities are lost just like in QtPyHammer-devs/vmf_tool#13

    UPDATE: This isn't actually a bug, turns out I forgot the code handles this case and didn't check before creating the issue :P Still, an update would be nice

    Try handling this like https://github.com/pySourceSDK / ValveVMF Where instead of a dict a list of [(key, value)] tuples store all keys without duplicates

    This will require:

    • [ ] New parsing approach
    • [ ] Refactor of Entities.search
      • [ ] Refactor all bsp methods (in branch scripts, e.g. worldspawn_volume) that touch ENTITIES lumps
        • TODO: list all such methods here so we can track progress
    • [ ] Re-compiling test/maps/Team Fortress 2/test2.bsp to match QtPyHammer-devs/vmf_tool's test2.vmf
    • [ ] A test that uses this test map to confirm this issue has not reappeared

    NOTE: io_import_rbsp will also need updating to support these changes

    Extending

    This might also be a good opportunity to use ValveVMF's parser on values And even using ValveFGD & custom classes for entities However this would likely require some re-engineering (of ValveVMF) to allow feeding the system flat nodes (unnamed curly brace groups) Not to mention some extra details to the parser, and maybe a deeper look at .fgd generation

    NOTE: Many source engine titles have .fgd files available via the VDC: link

    Maybe extenstions/fgd.py or bsp_tool_examples would be a place to try this out It would be preferable for the core lib to continue to function without any external dependencies ValveVMF parsing can also be quite slow, so deferring it's use until needed would be ideal

    enhancement 
    opened by snake-biscuits 2
  • [Test Maps] `monochrome.contagion`

    [Test Maps] `monochrome.contagion`

    • [x] Tools:

      • [x] Level Editor(s):
        • Hammer
        • Hammer++ TODO: figure out setup
      • [x] Compiler(s): Contagion SDK (comes with Contagion)
    • [ ] Map(s):

      • [ ] Basic room with spawnpoint & lighting
        • [ ] Entry insources.txt crediting mapper / contributor
        • [ ] Compiled
        • [ ] .bsp.info.txt file with compile log (.log in mapsrc)
        • [ ] Tested

    Active Mods / Modding Community (Optional):

    NOTE: monochrome.contagion branch is currently no different from valve.left4dead2 (at current level of understanding)

    Test Map Test Map: Tools: Hammer 
    opened by snake-biscuits 0
  • DisplacementInfo Neighbours aren’t mapped yet

    DisplacementInfo Neighbours aren’t mapped yet

    ~~The Source Engine definitions for ddispinfo_t mess with how C/C++ packs structs to create some oddly aligned structures~~

    ~~This means we can't use the Python struct module to define the whole structure, so we'll have to tack extra .from_bytes & .to_bytes methods on~~

    ~~It's going to get extremely messy but properly dealing with displacements is likely going to be the most complicated thing we ever do, besides advanced bitfields...~~

    Displacement Neighbour sub-structs aren't mapped yet

    Look at #74 & #73 for arguments for using inheritance to simplify this nightmare (valve.source.DisplacementInfo can do the black magic and the others can copy)

    We will also need Test Maps (#16) with at least one Displacement for #63, #38, #40 & #72

    4 DisplacementInfo variants to finish up:

    • [x] valve.source
      • [x] Test map: tests/maps/Team Fortress 2/test2.bsp
      • [x] Test map: tests/maps/Team Fortress 2/test_decompile_displacement.bsp
    • [ ] chaos_initiative.chaos
      • [ ] Test map: TODO
    • [ ] nexon.vindictus
      • [ ] Test map: TODO
      • [ ] nexon.cso2_2018
        • [ ] Test map: TODO

    NOTE: Team Fortress 2 test maps are for valve.orange_box, but they use the valve.source DisplacementInfo spec

    ~~Current DisplacementInfo implementations use base.Struct, which utilises __slots__, so no private members can be utilised afaik Stick to _classes if possible~~

    Enjoy the pain

    enhancement Test Map Test Map: Tools: Hammer Test Map: Tools: Unknown Test Map: Tools: Obscure documentation slow burn 
    opened by snake-biscuits 2
  • Reduce & Test for Duplicate `LumpClasses`

    Reduce & Test for Duplicate `LumpClasses`

    Many branch_scripts are for engine changes that just expand limits by increasing the size of indexing members Some of these changes were already performed in older branches e.g. id_software.quake_remake_old appears to be the first to update quake.Edge from uint16_t -> uint32_t

    Lots of branches likely do this We'll need to collect identically named branches (plus v2 etc. variants) & diff .as_cpp() cpp should be more reliable for the type footprint, since member names & definitions are still being unified (see #73)

    This should reduce the overall scale of the code base and help reduce those duplicates with largely copy-pasted definitions

    LumpClasses end up re-declaring & copying documentation from their parents a lot, as it's largely intended for each branch_script to serve as documentation, as much as code

    Though the LUMP_CLASSES etc. inheritance flies in the face of that a little... docs/supported somewhat remedies this At this point in time I still think LumpClasses should only be loosely dependant on their parents. though simplifying could help... If .as_cpp() collected comments from the annotations / type-hints we could probably simplify a lot of LumpClasses

    enhancement documentation slow burn 
    opened by snake-biscuits 1
  • Unified naming convention for lump names & LumpClass members

    Unified naming convention for lump names & LumpClass members

    This will involve some light refactoring

    A bunch of lump names differ across different branch scripts Many of these lumps share functionality, and even structs in some cases Unifying these different lumps to singular names with clearly conveyed use & context would really help documentation

    This could also hugely help research & tracing the iteration of various small engine concept (e.g. .bsp geometry rendering)

    I've already started doing a little of this and am already seeing some Quake 3 -> MoH:AA -> CoD -> Titanfall connections

    Refer to the new "Etymology" page on the wiki for more info on the rationale behind this

    TL;DR: make more code the same so we write less code and don't get confused as frequently

    documentation slow burn 
    opened by snake-biscuits 6
  • [Test Maps] `chaos`

    [Test Maps] `chaos`

    • [x] Tools:

      • Momentum Mod Playtest 0.9.4 [there is a waiting list]
    • [x] Map(s):

      • [x] Basic room with spawnpoint & lighting mapsrc/Hammer/Momentum Mod/mp_lobby.vmf -> maps/Momentum Mod/mp_lobby.bsp
        • [x] Entry insources.txt crediting mapper / contributor
        • [x] Compiled
        • [x] .bsp.info.txt file with compile log (.log in mapsrc)
        • [x] Tested
      • [ ] At least 1 Displacement
        • [ ] Entry in sources.txt crediting mapper / contributor
        • [ ] Compiled
        • [ ] .bsp.info.txt file with compile log (.log in mapsrc)
        • [ ] Tested

    NOTE: converted q3/chronic w/ BSPConversionLib --newbsp & it threw no loading errors, unsure if that was a fluke quake3 conversion seems to break texture projection, might look into fixes

    Active Mods / Modding Community (Optional):

    Test Map Test Map: Tools: Hammer Test Map: Tools: Obscure 
    opened by snake-biscuits 4
  • [extensions/decompile_rbsp] revisit plane indexing

    [extensions/decompile_rbsp] revisit plane indexing

    @F1F7Y over at MRVN-radiant/MRVN-radiant figured out plane indexing Time to revisit brush slicing https://github.com/MRVN-radiant/MRVN-radiant/blob/main/tools/remap/source/bspfile_titanfall.cpp#L607-L629

    Also seems like the discard/ignore plane flags are linked to ray collision, but not player collision

    Still doesn't solve model brush indexing for r2 so put in a lazy fix for that edge case so we can get sliced brush geo

    enhancement Test Map: Tools: Radiant 
    opened by snake-biscuits 0
Releases(v0.3.1)
  • v0.3.1(Oct 4, 2021)

  • v0.3.0(Sep 29, 2021)

    This version brings many changes to how files are handled, and supports a large number of games More big refactors to come, to help with handling associated files & saving changes back to the .bsp

    New

    • Added load_bsp function to identify bsp type
    • Added D3DBsp, IdTechBsp, RespawnBsp & ValveBsp classes
    • Added general support for the PakFile lump
    • Added general support for the GameLump lump
    • Extension scripts
      • archive.py extractor for CoD .iwd / Quake .pk3
      • diff.py compare bsps for changelogs / study
      • lightmaps.py bsp lightmap -> .png
    • Made a basic C++ 17 implementation in src/

    Changed

    • Bsp lumps are loaded dynamically, reducing memory usage
      • New wrapper classes can be found in bsp_tool/lumps.py
    • mods/ changed to branches/
      • Added subfolders for developers
      • Helpful lists for auto-detecting a .bsp's origin
      • Renamed team_fortress2 to valve/orange_box
    • LumpClasses now end up in 3 dictionaries per branch script
      • BASIC_LUMP_CLASSES for types like short int
      • LUMP_CLASSES for standard LumpClasses
      • SPECIAL_LUMP_CLASSES for irregular types (e.g. PakFile)
      • GAME_LUMP_CLASSES for GameLump SpecialLumpClasses
    • Bsps no longer print to console once loaded
    • Base.Bsp & subclasses have reserved ALL CAPS member names for lumps only
      • BSP_VERSION, FILE_MAGIC, HEADERS, REVISION -> bsp_version, file_magic, headers, revision
    • TODO: load external lumps and internal lumps at the same time

    New Supported Games

    • GoldSrc Engine (excluding Half-Life: Blue Shift)
    • Quake II
    • Quake 3 Arena
    • Source Engine

    Broken Support

    • Call of Duty
    • Dark Messiah of Might and Magic
    • Half-Life: Blue Shift
    • Quake

    Updated Game Support

    • Apex Legends
    • Orange Box
    • Titanfall
    • Titanfall 2
    Source code(tar.gz)
    Source code(zip)
    bsp_tool-0.3.0-py3-none-any.whl(95.53 KB)
    bsp_tool-0.3.0-py3.9.egg(175.66 KB)
    bsp_tool-0.3.0.tar.gz(69.92 KB)
Owner
Jared Ketterer
Jared Ketterer
Create animated ASCII-art for the command line almost instantly!

clippy Create and play colored 🟥 🟩 🟦 or colorless ⬛️ ⬜️ animated, or static, ASCII-art in the command line! clippy can help if you are wanting to;

Connor 10 Jun 26, 2022
Squirrel - A cli program to track writing progress

Squirrel Very much a WIP project squirrel is a command line program that tracks you writing progress and gives you useful information and cute and pic

3 Mar 23, 2022
Shellmon is a tool used to create and control a webshell remotely, created using the Python3

An Simple PHP Webshell Manager Description Shellmon is a tool used to create and control a webshell remotely, created using the Python3 programming la

22XploiterCrew 12 Dec 30, 2022
CLI translator based on Google translate API

Translate-CLI CLI переводчик основанный на Google translate API как пользоваться ? запустить в консоли скомпилированный скрипт (exe - windows, bin - l

7 Aug 13, 2022
A simple reverse shell in python

RevShell A simple reverse shell in python Getting started First, start the server python server.py Finally, start the client (victim) python client.py

Lojacopsen 4 Apr 06, 2022
My dotfiles -My configuration, with installations steps.

.dotfiles My configuration, with installations steps. Installation Oh My ZSH Install with this command: sh -c "$(curl -fsSL https://raw.githubusercont

Luca Angioloni 4 Dec 14, 2022
WA Terminal is a CLI application that allows us to login and send message with WhatsApp with a single command.

WA Terminal is a CLI application that allows us to login and send message with WhatsApp with a single command.

Aziz Fikri 15 Apr 15, 2022
A 3D engine powered by ASCII art

3D engine powered by ASCII art

Lingdong Huang 48 Nov 16, 2022
Yet another bash/zsh prompt script

Here we have yet another script for Git-aware customization of the command prompt in Bash and zsh. Unlike all the other scripts, I wrote this one, so

John T. Wodder II 5 Oct 13, 2021
A command line tool to hide and reveal information inside images (works for both PNGs and JPGs)

Imgrerite A command line tool to hide and reveal information inside images (works for both PNGs and JPGs) Dependencies Python 3 Git Most of the Linux

Jigyasu 10 Jul 27, 2022
Linux commands Interpreter for Windows and Mac based systems using Python

DBHTermEcIbP Linux commands Interpreter for Windows and Mac based systems using Python Basic Linux commands supported viewing current working director

Vraj Patel 1 Dec 26, 2021
🐍 Python CLI tool to get public information from a GitHub account

🐍 Gitter 🐍 Python CLI tool to get public information from a GitHub account 🤔 What's this? Gitter is a open-source project created to easily uses th

opp? 3 Oct 14, 2022
CLI utility for updating the EVE Online static data export in a postgres database

EVE SDE Postgres updater CLI utility for updating the EVE Online static data export postgres database. This has been tested with the Fuzzwork postgres

Markus Juopperi 1 Oct 29, 2021
A CLI application for storing contacts as a csv file written in Python.

Contacter A CLI application for storing contacts as a csv file written in Python. You can use this to save your contacts with a special relations tag

nostalgicnerdpenguin 1 Oct 23, 2021
texel - Command line interface for reading spreadsheets inside terminal

texel - Command line interface for reading spreadsheets inside terminal. Sometimes, you have to deal with spreadsheets. Those are sad times. Fortunate

128 Dec 19, 2022
CLI tool to develop StarkNet projects written in Cairo

⛵ Nile Navigate your StarkNet projects written in Cairo. Installation pip install cairo-nile Usage Install Cairo Use nile to install a given version o

Martín Triay 305 Dec 30, 2022
A begginer reverse shell tool python.

A begginer tools for hacking. The theme of this repository is to bring some ready-made open-source tools for anyone new to the world of hacking. This

Dio brando 2 Jan 05, 2022
Unofficial Open Corporates CLI: OpenCorporates is a website that shares data on corporations under the copyleft Open Database License. This is an unofficial open corporates python command line tool.

Unofficial Open Corporates CLI OpenCorporates is a website that shares data on corporations under the copyleft Open Database License. This is an unoff

Richard Mwewa 30 Sep 08, 2022
A terminal slots programme in PY

PYSlots PyPI and Test PyPI External Links PyPI Test PyPI Install Look directly at the bugs! Version pip install pyslots "Don't look directly at the bu

Luke Batema 4 Nov 30, 2022
Salesforce object access auditor

Salesforce object access auditor Released as open source by NCC Group Plc - https://www.nccgroup.com/ Developed by Jerome Smith @exploresecurity (with

NCC Group Plc 90 Sep 19, 2022