Skip to content

Instantly share code, notes, and snippets.

@woctezuma
Last active April 25, 2024 10:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save woctezuma/c5259c3851c44bbbb6f2a4ce83c010e1 to your computer and use it in GitHub Desktop.
Save woctezuma/c5259c3851c44bbbb6f2a4ce83c010e1 to your computer and use it in GitHub Desktop.
Look for words in Discord profiles (pronouns and bio)
import json
from pathlib import Path
BIO_FIELD = ["bio"]
PRONOUNS_FIELD = ["pronouns"]
fname = "profiles.json"
with Path(fname).open() as fn:
d = json.load(fn)
def check_word(word: str, data: dict, fields: list[str]) -> bool:
return any(data[f] and word in data[f].lower() for f in fields)
def check_altered_word(word: str, data: dict, fields: list[str]) -> bool:
word_sep = "/"
min_num_letters = 3
if len(word) >= min_num_letters:
for i in range(len(word)):
altered_word_a = word[:i] + word_sep + word[(i + 1) :]
altered_word_b = word[:i] + word_sep + word[i:]
if check_word(altered_word_a, data, fields) or check_word(
altered_word_b,
data,
fields,
):
return True
return False
def has_problematic_pronouns(word: str, member_data: dict) -> bool:
return check_word(word, member_data, PRONOUNS_FIELD) or check_altered_word(
word,
member_data,
PRONOUNS_FIELD,
)
def has_problematic_bio(word: str, member_data: dict) -> bool:
return check_word(word, member_data, BIO_FIELD)
def display_results(data: dict, fields: list[str]) -> None:
s = "\t".join([data[f] for f in fields if data[f]])
print(f'<@{data["id"]}>{s}\n')
def display_member_list(member_list: set[int], member_sep: str = "\n") -> None:
print(member_sep.join([f"<@{i}>" for i in sorted(member_list)]))
def run_workflow(
word: str,
member_list: set[int],
*,
verbose: bool,
) -> set[int]:
lower_word = word.lower()
for member_data in d.values():
if has_problematic_pronouns(lower_word, member_data) or has_problematic_bio(
lower_word,
member_data,
):
member_list.add(member_data["id"])
if verbose:
display_results(member_data, PRONOUNS_FIELD + BIO_FIELD)
return member_list
def main() -> None:
words = ["hitler", "hither", "nazi"]
member_list = set()
member_sep = ", "
verbose = True
print(words)
for word in words:
member_list = run_workflow(word, member_list, verbose=verbose)
if member_list:
display_member_list(member_list, member_sep)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment