!iuyQXswfjgxQMZGrfQ:matrix.org

Python

979 Members
CoC: https://bit.ly/3ngytsS | Docs: https://docs.python.org/3/ | Tutorial: https://bit.ly/3ngpM1N | Free Beginner Book: https://bit.ly/3bfFTKF48 Servers

Load older messages


SenderMessageTime
8 Mar 2021
@sage_:matrix.orgsage_
In reply to @sage_:matrix.org
Does anyone know how to turn off this feature (PyCharm)? https://i.imgur.com/hd2PW2x.gif
Apparently it's called Column Selection Mode and it's Alt+Shift+Insert to toggle
16:48:25
@onessa:matrix.orgonessa
In reply to @sage_:matrix.org
Apparently it's called Column Selection Mode and it's Alt+Shift+Insert to toggle
fascinating never seen that one before but i don't even know half of the stuff in Pycharm from my year of use
17:35:06
@sage_:matrix.orgsage_
In reply to @onessa:matrix.org
fascinating never seen that one before but i don't even know half of the stuff in Pycharm from my year of use
yeah amount of features is staggering. I've been using for 3+ years and I'm still amazed and slightly overwhelmed by the number of features
17:38:37
@onessa:matrix.orgonessayeah i just got poetry,black, and CI setup and still tweaking stuff17:42:19
@onessa:matrix.orgonessaI wanted this but on gitlab https://medium.com/@vanflymen/blazing-fast-ci-with-github-actions-poetry-black-and-pytest-9e74299dd4a517:42:49
@onessa:matrix.orgonessaEnded up using this to start the project https://pawamoy.github.io/copier-poetry/17:43:08
@onessa:matrix.orgonessaother then some minor github hardcoded stuff which were overlooked it seems to work nicely. Plan on submitting a PR to get those minor things fixed upstream when im done dialing it in.17:44:25
@sage_:matrix.orgsage_very fascinating! adding the Medium article to my read list. +1 for Black+Poetry+Pytest. Just discovered Black last month, I use it religiously now17:48:24
@michael:michaelsasser.orgMichael

I use pre-commit in GH actions. You can use it on your machine as git hook and as action on GH.

CI:

name: Python CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master, develop ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.9
        uses: actions/setup-python@v2.2.1
        with:
          python-version: 3.9

      - name: Install Poetry
        uses: snok/install-poetry@v1.1.2
        with:
          virtualenvs-create: true
          virtualenvs-in-project: true

      - name: Load cached venv
        id: cached-poetry-dependencies
        uses: actions/cache@v2.1.4
        with:
          path: .venv
          key: venv-<span data-mx-maths="{{ runner.os }}-"></span>{{ hashFiles('**/poetry.lock') }}

      - name: Install Project Dependencies
        run: poetry install -E docs
        if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'

      - name: Run pre-commit
        run: |
          source .venv/bin/activate
          pre-commit run --all-files

      - name: Sphinx Build
        working-directory: ./docs
        run: |
          source ../.venv/bin/activate
          make html
      - name: Test with pytest
        run: |
          source .venv/bin/activate
          poetry run pytest

Docs:

name: github pages

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      working-directory: ./docs
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Python 3.9
        uses: actions/setup-python@v2.2.1
        with:
          python-version: 3.9

      - name: Install Poetry
        uses: snok/install-poetry@v1.1.2
        with:
          virtualenvs-create: true
          virtualenvs-in-project: true

      - name: Load cached venv
        id: cached-poetry-dependencies
        uses: actions/cache@v2.1.4
        with:
          path: .venv
          key: venv-<span data-mx-maths="{{ runner.os }}-"></span>{{ hashFiles('**/poetry.lock') }}

      - name: Install Project Dependencies
        run: poetry install -E docs
        if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'

      - name: Make docs
        working-directory: <span data-mx-maths="{{env.working-directory}}
        run: |
          source ../.venv/bin/activate
          make html
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: "></span>{{ secrets.GITHUB_TOKEN }}
          publish_dir: ./docs/build/html/

CD:

name: Upload Release Asset

on:
  push:
    tags:
      - "v*"

jobs:
  build:
    name: Upload Release Asset
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Python 3.9
        uses: actions/setup-python@v2.2.1
        with:
          python-version: 3.9

      - name: Install Poetry
        uses: snok/install-poetry@v1.1.2
        with:
          virtualenvs-create: true
          virtualenvs-in-project: true

      - name: Load cached venv
        id: cached-poetry-dependencies
        uses: actions/cache@v2.1.4
        with:
          path: .venv
          key: venv-<span data-mx-maths="{{ runner.os }}-"></span>{{ hashFiles('**/poetry.lock') }}

      - name: Build project
        run: poetry build

      - name: pypi-publish
        uses: pypa/gh-action-pypi-publish@v1.4.2
        with:
          # PyPI user
          # user: # optional, default is __token__
          # Password for your PyPI user or an access token
          password: <span data-mx-maths="{{ secrets.pypi_token }}
          # The repository URL to use
          # repository_url: # optional
          # The target directory for distribution
          # packages_dir: # optional, default is dist

      - name: Zip project
        run: zip --junk-paths MyProject.zip  dist/* README.md LICENSE.txt

      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: "></span>{{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: <span data-mx-maths="{{ github.ref }}
          release_name: Release "></span>{{ github.ref }}
          draft: true
          prerelease: true

      - name: Upload Release Asset
        id: upload-release-asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: <span data-mx-maths="{{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: "></span>{{ steps.create_release.outputs.upload_url }}
          asset_path: ./MyProject.zip
          asset_name: MyProject.zip
          asset_content_type: application/zip

This is what my .pre-commit-config.yaml looks like:

minimum_pre_commit_version: 2.10.1
# default_language_version:
#   python: python3.9
repos:
  - repo: meta
    hooks:
      - id: check-hooks-apply
      - id: check-useless-excludes

  # pre-commit-hooks
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.4.0
    hooks:
      # Prevent giant files from being committed.
      - id: check-added-large-files
      # Simply check whether files parse as valid python.
      - id: check-ast
      # Require literal syntax when initializing empty or zero Python builtin
      # types.
      - id: check-builtin-literals
      # Forbid files which have a UTF-8 byte-order marker
      - id: check-byte-order-marker
      # Check for files with names that would conflict on a case-insensitive
      # filesystem like MacOS HFS+ or Windows FAT.
      - id: check-case-conflict
      # Checks for a common error of placing code before the docstring.
      - id: check-docstring-first
      # check-executables-have-shebangs
      #- id: check-executables-have-shebangs
      # Attempts to load all json files to verify syntax.
      # - id: check-json
      # Check for files that contain merge conflict strings.
      - id: check-merge-conflict
      # Checks for symlinks which do not point to anything.
      # - id: check-symlinks
      # Attempts to load all TOML files to verify syntax.
      - id: check-toml
      # Ensures that links to vcs websites are permalinks.
      - id: check-vcs-permalinks
      # Attempts to load all xml files to verify syntax.
      # - id: check-xml
      # Attempts to load all yaml files to verify syntax.
      - id: check-yaml
      # Check for debugger imports and breakpoint() calls in python source.
      - id: debug-statements
      # Detects symlinks which are changed to regular files with a content
      - id: destroyed-symlinks
      # Checks for the existence of AWS secrets, set up with the AWS CLI.
      # - id: detect-aws-credentials
      # Checks for the existence of private keys.
      - id: detect-private-key
      # This hook replaces double quoted strings with single quoted strings.
      # - id: double-quote-string-fixer (KEEP DISABLED)
      # Makes sure files end in a newline and only a newline.
      - id: end-of-file-fixer
      # Removes "# -*- coding: utf-8 -*-" on the top of python files.
      - id: fix-encoding-pragma
        args: [ "--remove" ]
      # Sort the lines in specified files (defaults to alphabetical).
      # - id: file-contents-sorter (KEEP DISABLED)
      # Replaces or checks mixed line ending to LF.
      - id: mixed-line-ending
        args: [ "--fix=lf" ]
      # Assert that files in tests/ match test*.py.
      - id: name-tests-test
        args: [ "--django" ]
      # Protect specific branches from direct checkins.
      - id: no-commit-to-branch
        args:
          - "-b master"
          - "-p release/.*"
      # Checks that all your JSON files are pretty.
      # - id: pretty-format-json
      #   args: ["--autofix"]
      # Sorts entries in requirements.txt and removes incorrect entry
      # - id: requirements-txt-fixer  (KEEP DISABLED)
      # Sorts simple YAML files which consist only of top-level keys,
      # preserving comments and blocks.
      # - id: sort-simple-yaml  (KEEP DISABLED)
      # Trims trailing whitespace.
      - id: trailing-whitespace
      # - id: flake8
      #   additional_dependencies: ["flake8-bugbear"]

  - repo: https://github.com/pre-commit/pygrep-hooks
    rev: v1.7.1
    hooks:
      # Enforce that noqa annotations always occur with specific codes.
      # Sample annotations: # noqa: F401, # noqa: F401,W203
      - id: python-check-blanket-noqa
      # Prevent common mistakes of assert mck.not_called(),
      # assert mck.called_once_with(...) and mck.assert_called.
      - id: python-check-mock-methods
      # A quick check for the eval() built-in function
      - id: python-no-eval
      # A quick check for the deprecated .warn() method of python loggers
      - id: python-no-log-warn
      # Enforce that python3.6+ type annotations are used instead of
      # type comments
      - id: python-use-type-annotations
      # Detect common mistake of using single backticks when writing rst
      - id: rst-backticks
      # Detect mistake of rst directive not ending with double colon
      - id: rst-directive-colons
      #Detect mistake of inline code touching normal text in rst
      - id: rst-inline-touching-normal
      # Forbid files which have a UTF-8 Unicode replacement character
      - id: text-unicode-replacement-char

  # isort
  - repo: https://github.com/timothycrosley/isort
    rev: 5.7.0
    hooks:
      - id: isort
        additional_dependencies: [ toml ]

  # format: black
  - repo: https://github.com/ambv/black
    rev: 20.8b1
    hooks:
      - id: black

  # flake8
  - repo: https://gitlab.com/pycqa/flake8
    rev: 3.8.4
    hooks:
      - id: flake8
        additional_dependencies: [ "flake8-bugbear" ]

  # check docstrings
  - repo: https://github.com/PyCQA/pydocstyle
    rev: 5.1.1
    hooks:
      - id: pydocstyle
        args: [ "--ignore=D10,D21,D202" ]

  # static type checking with mypy
  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: v0.800
    hooks:
      - id: mypy

  # vulture
  - repo: https://github.com/jendrikseipp/vulture
    rev: "v2.3"
    hooks:
      - id: vulture
17:55:08
@michael:michaelsasser.orgMichaelWow, that went big, sorry.17:55:27
@michael:michaelsasser.orgMichael *

I use pre-commit in GH actions. You can use it on your machine as git hook and as action on GH.

CI:

name: Python CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master, develop ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.9
        uses: actions/setup-python@v2.2.1
        with:
          python-version: 3.9

      - name: Install Poetry
        uses: snok/install-poetry@v1.1.2
        with:
          virtualenvs-create: true
          virtualenvs-in-project: true

      - name: Load cached venv
        id: cached-poetry-dependencies
        uses: actions/cache@v2.1.4
        with:
          path: .venv
          key: venv-<span data-mx-maths="{{ runner.os }}-"></span>{{ hashFiles('**/poetry.lock') }}

      - name: Install Project Dependencies
        run: poetry install -E docs
        if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'

      - name: Run pre-commit
        run: |
          source .venv/bin/activate
          pre-commit run --all-files

      - name: Sphinx Build
        working-directory: ./docs
        run: |
          source ../.venv/bin/activate
          make html
      - name: Test with pytest
        run: |
          source .venv/bin/activate
          poetry run pytest

Docs:

name: github pages

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      working-directory: ./docs
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Python 3.9
        uses: actions/setup-python@v2.2.1
        with:
          python-version: 3.9

      - name: Install Poetry
        uses: snok/install-poetry@v1.1.2
        with:
          virtualenvs-create: true
          virtualenvs-in-project: true

      - name: Load cached venv
        id: cached-poetry-dependencies
        uses: actions/cache@v2.1.4
        with:
          path: .venv
          key: venv-<span data-mx-maths="{{ runner.os }}-"></span>{{ hashFiles('**/poetry.lock') }}

      - name: Install Project Dependencies
        run: poetry install -E docs
        if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'

      - name: Make docs
        working-directory: <span data-mx-maths="{{env.working-directory}}
        run: |
          source ../.venv/bin/activate
          make html
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: "></span>{{ secrets.GITHUB_TOKEN }}
          publish_dir: ./docs/build/html/

CD:

name: Upload Release Asset

on:
  push:
    tags:
      - "v*"

jobs:
  build:
    name: Upload Release Asset
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Python 3.9
        uses: actions/setup-python@v2.2.1
        with:
          python-version: 3.9

      - name: Install Poetry
        uses: snok/install-poetry@v1.1.2
        with:
          virtualenvs-create: true
          virtualenvs-in-project: true

      - name: Load cached venv
        id: cached-poetry-dependencies
        uses: actions/cache@v2.1.4
        with:
          path: .venv
          key: venv-<span data-mx-maths="{{ runner.os }}-"></span>{{ hashFiles('**/poetry.lock') }}

      - name: Build project
        run: poetry build

      - name: pypi-publish
        uses: pypa/gh-action-pypi-publish@v1.4.2
        with:
          # PyPI user
          # user: # optional, default is __token__
          # Password for your PyPI user or an access token
          password: <span data-mx-maths="{{ secrets.pypi_token }}
          # The repository URL to use
          # repository_url: # optional
          # The target directory for distribution
          # packages_dir: # optional, default is dist

      - name: Zip project
        run: zip --junk-paths MyProject.zip  dist/* README.md LICENSE.txt

      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: "></span>{{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: <span data-mx-maths="{{ github.ref }}
          release_name: Release "></span>{{ github.ref }}
          draft: true
          prerelease: true

      - name: Upload Release Asset
        id: upload-release-asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: <span data-mx-maths="{{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: "></span>{{ steps.create_release.outputs.upload_url }}
          asset_path: ./MyProject.zip
          asset_name: MyProject.zip
          asset_content_type: application/zip

This is what my .pre-commit-config.yaml looks like:

minimum_pre_commit_version: 2.10.1
# default_language_version:
#   python: python3.9
repos:
  - repo: meta
    hooks:
      - id: check-hooks-apply
      - id: check-useless-excludes

  # pre-commit-hooks
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.4.0
    hooks:
      # Prevent giant files from being committed.
      - id: check-added-large-files
      # Simply check whether files parse as valid python.
      - id: check-ast
      # Require literal syntax when initializing empty or zero Python builtin
      # types.
      - id: check-builtin-literals
      # Forbid files which have a UTF-8 byte-order marker
      - id: check-byte-order-marker
      # Check for files with names that would conflict on a case-insensitive
      # filesystem like MacOS HFS+ or Windows FAT.
      - id: check-case-conflict
      # Checks for a common error of placing code before the docstring.
      - id: check-docstring-first
      # check-executables-have-shebangs
      #- id: check-executables-have-shebangs
      # Attempts to load all json files to verify syntax.
      # - id: check-json
      # Check for files that contain merge conflict strings.
      - id: check-merge-conflict
      # Checks for symlinks which do not point to anything.
      # - id: check-symlinks
      # Attempts to load all TOML files to verify syntax.
      - id: check-toml
      # Ensures that links to vcs websites are permalinks.
      - id: check-vcs-permalinks
      # Attempts to load all xml files to verify syntax.
      # - id: check-xml
      # Attempts to load all yaml files to verify syntax.
      - id: check-yaml
      # Check for debugger imports and breakpoint() calls in python source.
      - id: debug-statements
      # Detects symlinks which are changed to regular files with a content
      - id: destroyed-symlinks
      # Checks for the existence of AWS secrets, set up with the AWS CLI.
      # - id: detect-aws-credentials
      # Checks for the existence of private keys.
      - id: detect-private-key
      # This hook replaces double quoted strings with single quoted strings.
      # - id: double-quote-string-fixer (KEEP DISABLED)
      # Makes sure files end in a newline and only a newline.
      - id: end-of-file-fixer
      # Removes "# -*- coding: utf-8 -*-" on the top of python files.
      - id: fix-encoding-pragma
        args: [ "--remove" ]
      # Sort the lines in specified files (defaults to alphabetical).
      # - id: file-contents-sorter (KEEP DISABLED)
      # Replaces or checks mixed line ending to LF.
      - id: mixed-line-ending
        args: [ "--fix=lf" ]
      # Assert that files in tests/ match test*.py.
      - id: name-tests-test
        args: [ "--django" ]
      # Protect specific branches from direct checkins.
      - id: no-commit-to-branch
        args:
          - "-b master"
          - "-p release/.*"
      # Checks that all your JSON files are pretty.
      # - id: pretty-format-json
      #   args: ["--autofix"]
      # Sorts entries in requirements.txt and removes incorrect entry
      # - id: requirements-txt-fixer  (KEEP DISABLED)
      # Sorts simple YAML files which consist only of top-level keys,
      # preserving comments and blocks.
      # - id: sort-simple-yaml  (KEEP DISABLED)
      # Trims trailing whitespace.
      - id: trailing-whitespace
      # - id: flake8
      #   additional_dependencies: ["flake8-bugbear"]

  - repo: https://github.com/pre-commit/pygrep-hooks
    rev: v1.7.1
    hooks:
      # Enforce that noqa annotations always occur with specific codes.
      # Sample annotations: # noqa: F401, # noqa: F401,W203
      - id: python-check-blanket-noqa
      # Prevent common mistakes of assert mck.not_called(),
      # assert mck.called_once_with(...) and mck.assert_called.
      - id: python-check-mock-methods
      # A quick check for the eval() built-in function
      - id: python-no-eval
      # A quick check for the deprecated .warn() method of python loggers
      - id: python-no-log-warn
      # Enforce that python3.6+ type annotations are used instead of
      # type comments
      - id: python-use-type-annotations
      # Detect common mistake of using single backticks when writing rst
      - id: rst-backticks
      # Detect mistake of rst directive not ending with double colon
      - id: rst-directive-colons
      #Detect mistake of inline code touching normal text in rst
      - id: rst-inline-touching-normal
      # Forbid files which have a UTF-8 Unicode replacement character
      - id: text-unicode-replacement-char

  # isort
  - repo: https://github.com/timothycrosley/isort
    rev: 5.7.0
    hooks:
      - id: isort
        additional_dependencies: [ toml ]

  # format: black
  - repo: https://github.com/ambv/black
    rev: 20.8b1
    hooks:
      - id: black

  # flake8
  - repo: https://gitlab.com/pycqa/flake8
    rev: 3.8.4
    hooks:
      - id: flake8
        additional_dependencies: [ "flake8-bugbear" ]

  # check docstrings
  - repo: https://github.com/PyCQA/pydocstyle
    rev: 5.1.1
    hooks:
      - id: pydocstyle
        args: [ "--ignore=D10,D21,D202" ]

  # static type checking with mypy
  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: v0.800
    hooks:
      - id: mypy

  # vulture
  - repo: https://github.com/jendrikseipp/vulture
    rev: "v2.3"
    hooks:
      - id: vulture
17:56:51
@techcable:matrix.orgTechcable joined the room.19:02:08
@fantasight:matrix.orgfantasight joined the room.19:36:57
@fantasight:matrix.orgfantasightNice 20:03:02
@v5l3gs:matrix.orgv5l3gsI'm trying to create a script that scans files (specifically .java files) for certain strings to check if they are malicious. print("Which file would you like to scan.") filetoscan = input("> ") file = open(filetoscan, "r") strings = ["user", "google"] if strings in file.read(): print("Found strings") I want to scan through a list of keywords but whenever I try I get Traceback (most recent call last): File "/home/.../Documents/coding/jarscan.py", line 7, in <module> if strings in file.read(): TypeError: 'in <string>' requires string as left operand, not list Is there a way I can search a list of strings?20:26:23
@v5l3gs:matrix.orgv5l3gs * I'm trying to create a script that scans files (specifically .java files) for certain strings to check if they are malicious. print("Which file would you like to scan.") filetoscan = input("> ") file = open(filetoscan, "r") strings = ["user", "google"] if strings in file.read(): print("Found strings") I want to scan through a list of keywords but whenever I try I get line 7, in <module> if strings in file.read(): TypeError: 'in <string>' requires string as left operand, not list Is there a way I can search a list of strings?20:26:43
@v5l3gs:matrix.orgv5l3gsOr is there another way I can do it to achieve the same result?20:27:45
@v5l3gs:matrix.orgv5l3gs * I'm trying to create a script that scans files (specifically .java files) for certain strings to check if they are malicious. print("Which file would you like to scan.") filetoscan = input("> ") file = open(filetoscan, "r") strings = ["user", "google"] if strings in file.read(): print("Found strings") I want to scan through a list of keywords but whenever I try I get Traceback (most recent call last): File "/home/.../Documents/coding/jarscan.py", line 7, in <module> if strings in file.read(): TypeError: 'in <string>' requires string as left operand, not list Is there a way I can search a list of strings?20:32:14
@fuzzmz:fuzz.me.ukfuzzmz

v5l3gs, you can do something like

print("Which file would you like to scan?")
filetoscan = input("> ")

strings = ["user", "google"]

with open(filetoscan, 'r') as f:
    for line in f:
        if any(word in line for word in strings):
            print("Found strings")
20:33:13
@fuzzmz:fuzz.me.ukfuzzmzbasically open the file, go through each line and check if any of the words in your strings list is on that line20:33:45
@v5l3gs:matrix.orgv5l3gsOk thanks20:33:46
@nichi:matrix.orgnichi joined the room.20:44:30
@gowness:herp.xyzgowness joined the room.21:03:43
@keysemble:matrix.orgkeysemble

fuzzmz:

         if any(word in line for word in strings):

Noice! Well written.

21:16:17
@fuzzmz:fuzz.me.ukfuzzmz *

v5l3gs, you can do something like

print("Which file would you like to scan?")
filetoscan = input("> ")

strings = ["user", "google"]

with open(filetoscan, 'r') as f:
    for line in f:
        if any(word in line for word in strings):
            print("Found strings")
21:17:08
@keysemble:matrix.orgkeysembleFP style at its finest.21:17:48
@fuzzmz:fuzz.me.ukfuzzmzhah, didn't even think of it as functional programming-like until now21:23:22
@fuzzmz:fuzz.me.ukfuzzmzit just felt... pythonic21:23:28
@keysemble:matrix.orgkeysemble

That too, it reads like English:

If any word in line for word in strings

21:24:47
@keysemble:matrix.orgkeysembleI'm probably overreacting, but I just really like what I saw there.21:26:47

There are no newer messages yet.


Back to Room List