{"id":15046349,"url":"https://github.com/base4security/t3sf","last_synced_at":"2025-10-08T18:19:21.756Z","repository":{"id":62591093,"uuid":"483674631","full_name":"Base4Security/T3SF","owner":"Base4Security","description":"Technical Tabletop Exercises Simulation Framework","archived":false,"fork":false,"pushed_at":"2023-10-30T18:18:33.000Z","size":6664,"stargazers_count":44,"open_issues_count":3,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-30T06:04:22.457Z","etag":null,"topics":["discord","discord-bot","framework","orchestration","python","python-3","python3","simulation","simulation-framework","slack","slack-bot","telegram","telegram-bot","training","ttx","whatsapp","whatsapp-bot"],"latest_commit_sha":null,"homepage":"https://T3SF.readthedocs.io/en/latest/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Base4Security.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-04-20T13:51:55.000Z","updated_at":"2024-05-27T11:13:52.000Z","dependencies_parsed_at":"2022-11-03T22:49:55.425Z","dependency_job_id":"feaf3735-dce8-453c-ae25-c6e0db2cfd36","html_url":"https://github.com/Base4Security/T3SF","commit_stats":{"total_commits":37,"total_committers":3,"mean_commits":"12.333333333333334","dds":0.4054054054054054,"last_synced_commit":"182ddc9b7bf804e93bbfe9d3f2112d8c20f7fec6"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Base4Security%2FT3SF","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Base4Security%2FT3SF/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Base4Security%2FT3SF/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Base4Security%2FT3SF/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Base4Security","download_url":"https://codeload.github.com/Base4Security/T3SF/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238394323,"owners_count":19464583,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["discord","discord-bot","framework","orchestration","python","python-3","python3","simulation","simulation-framework","slack","slack-bot","telegram","telegram-bot","training","ttx","whatsapp","whatsapp-bot"],"created_at":"2024-09-24T20:53:00.838Z","updated_at":"2025-10-08T18:19:21.637Z","avatar_url":"https://github.com/Base4Security.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"\" rel=\"noopener\"\u003e\n \u003cimg width=200px height=200px src=\"https://user-images.githubusercontent.com/103124157/164258966-7a049d6c-4012-49ca-8f7d-2bb814c24009.png\" alt=\"T3SF Logo\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch3 align=\"center\"\u003eT3SF\u003c/h3\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \n  [![Status](https://img.shields.io/badge/status-active-success.svg)]() \n  [![PyPI version](https://badge.fury.io/py/T3SF.svg)](https://badge.fury.io/py/T3SF)\n  [![Documentation Status](https://readthedocs.org/projects/t3sf/badge/?version=latest)](https://t3sf.readthedocs.io/en/latest/?badge=latest)\n  [![License](https://img.shields.io/badge/license-GPL-blue.svg)](/LICENSE)\n  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.6519221.svg)](https://doi.org/10.5281/zenodo.6519221)\n\u003c/div\u003e\n\u003cdiv align=\"center\"\u003e\n  \n  [![Docker Image for Discord](https://github.com/Base4Security/T3SF/actions/workflows/publish_discord.yml/badge.svg)](https://hub.docker.com/r/base4sec/t3sf)\n  [![Docker Image for Slack](https://github.com/Base4Security/T3SF/actions/workflows/publish_slack.yml/badge.svg)](https://hub.docker.com/r/base4sec/t3sf)\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e Technical Tabletop Exercises Simulation Framework\n    \u003cbr\u003e \n\u003c/p\u003e\n\n## Table of Contents\n- [About](#About)\n- [Getting Things Ready](#Starting)\n- [TODO](./TODO.md)\n- [CHANGELOG](./CHANGELOG.md)\n- [Contributing](./CONTRIBUTING.md)\n\n## About \u003ca name = \"About\"\u003e\u003c/a\u003e\nT3SF is a framework that offers a modular structure for the orchestration of events based on a master scenario events list (MSEL) together with a set of rules defined for each exercise (optional) and a configuration that allows defining the parameters of the corresponding platform. The main module performs the communication with the specific module (Discord, Slack, Telegram, etc.) that allows the events to present the events in the input channels as injects for each platform. In addition, the framework supports different use cases: \"single organization, multiple areas\", \"multiple organization, single area\" and \"multiple organization, multiple areas\".\n\n## Getting Things Ready \u003ca name = \"Starting\"\u003e\u003c/a\u003e\nTo use the framework with your desired platform, whether it's Slack or Discord, you will need to install the required modules for that platform. But don't worry, installing these modules is easy and straightforward.\n\nTo do this, you can follow this simple step-by-step guide, or if you're already comfortable installing packages with `pip`, you can skip to the last step!\n\n```bash\n# Python 3.6+ required\npython -m venv .venv       # We will create a python virtual environment\nsource .venv/bin/activate  # Let's get inside it\n\npip install -U pip         # Upgrade pip\n```\n\nOnce you have created a Python virtual environment and activated it, you can install the T3SF framework for your desired platform by running the following command:\n\n```bash\npip install \"T3SF[Discord]\"  # Install the framework to work with Discord\n```\nor\n\n```bash\npip install \"T3SF[Slack]\"  # Install the framework to work with Slack\n```\n\nThis will install the T3SF framework along with the required dependencies for your chosen platform. Once the installation is complete, you can start using the framework with your platform of choice.\n\nWe strongly recommend following the platform-specific guidance within our Read The Docs! Here are the links:\n\n  - [Discord](https://t3sf.readthedocs.io/en/latest/Discord.html#installation)\n  - [Slack](https://t3sf.readthedocs.io/en/latest/Slack.html#installation)\n  - [Telegram](https://t3sf.readthedocs.io/en/latest/Telegram.html#installation)\n  - [WhatsApp](https://t3sf.readthedocs.io/en/latest/WhatsApp.html#installation)\n\n## Usage \u003ca name=\"Usage\"\u003e\u003c/a\u003e\nWe created this framework to simplify all your work!\n\n\n\u003cdetails\u003e\n\u003csummary\u003eUsing Docker\u003c/summary\u003e\n\n### Supported Tags\n- slack → This image has all the requirements to perform an exercise in Slack.\n- discord → This image has all the requirements to perform an exercise in Discord.\n\n\n#### Using it with Slack\n\n```bash\n$ docker run --rm -t --env-file .env -v $(pwd)/MSEL.json:/app/MSEL.json base4sec/t3sf:slack\n```\n\nInside your `.env` file you have to provide the `SLACK_BOT_TOKEN` and `SLACK_APP_TOKEN` tokens. Read more about it [here](https://t3sf.readthedocs.io/en/latest/Slack.html#providing-the-tokens).\n\nThere is another environment variable to set, `MSEL_PATH`. This variable tells the framework in which path the MSEL is located. By default, the container path is `/app/MSEL.json`. If you change the mount location of the volume then also change the variable.\n\n\n#### Using it with Discord\n\n```bash\n$ docker run --rm -t --env-file .env -v $(pwd)/MSEL.json:/app/MSEL.json base4sec/t3sf:discord\n```\n\nInside your `.env` file you have to provide the `DISCORD_TOKEN` token. Read more about it [here](https://t3sf.readthedocs.io/en/latest/Discord.html#providing-the-token).\n\nThere is another environment variable to set, `MSEL_PATH`. This variable tells the framework in which path the MSEL is located. By default, the container path is `/app/MSEL.json`. If you change the mount location of the volume then also change the variable.\n\n---------------------\n\u003c/details\u003e\n\nOnce you have everything ready, use our template for the `main.py`, or modify the following code:\n\nHere is an example if you want to run the framework with the `Discord` bot and a `GUI`.\n\n```python\nfrom T3SF import T3SF\nimport asyncio\n\nasync def main():\n    await T3SF.start(MSEL=\"MSEL_TTX.json\", platform=\"Discord\", gui=True)\n\nif __name__ == '__main__':\n    asyncio.run(main())\n```\n\nOr if you prefer to run the framework without `GUI` and with `Slack` instead, you can modify the arguments, and that's it! \n\nYes, that simple!\n\n```python\nawait T3SF.start(MSEL=\"MSEL_TTX.json\", platform=\"Slack\", gui=False)\n```\n\nIf you need more help, you can always check our documentation [here](https://t3sf.readthedocs.io/en/latest/)!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbase4security%2Ft3sf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbase4security%2Ft3sf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbase4security%2Ft3sf/lists"}