<commit_before>//////////////////////////////////////////////////////////////////////////
//
// SneezyMUD - All rights reserved, SneezyMUD Coding Team
//
// Garble.cc
// Code for changing how players talk
//////////////////////////////////////////////////////////////////////////

#include "stdsneezy.h"
#include "garble.h"

// utility functions defined below
const sstring RandomPhrase(bool allowRecursivePhrase);

// Garble functions - defined here so peeps dont reference them outside of this file
sstring garble_blahblah(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_PG13filter(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_drunk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_sign(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_innuendo(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_excited(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_glubglub(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_ghost(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_wahwah(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_pirate(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_freshprince(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_fishtalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_lolcats(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_vampire(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_igor(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_olddrunk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_irish(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_trolltalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_frogtalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_birdtalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_gutter(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_trogtalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);

TGarble GarbleData[GARBLE_MAX] = {
  { "innuendo", "Makes the character end sentences, if you know what I mean", false, GARBLE_SCOPE_EVERYONE, garble_innuendo, SPEECH_FLAG_VERBAL },
  { "excited", "Makes the character end phrases with exclamations!!", false, GARBLE_SCOPE_EVERYONE, garble_excited, SPEECH_FLAG_VERBAL },
  { "sign", "Applies to signing, if the character's skill level < maxed", true, GARBLE_SCOPE_EVERYONE, garble_sign, SPEECH_FLAG_SIGN },
  { "ghost", "Makes the character talk OOooooo scary!", false, GARBLE_SCOPE_EVERYONE, garble_ghost, SPEECH_FLAG_VERBALEM },
  { "wahwah", "Makes the character cry like a little baby", false, GARBLE_SCOPE_EVERYONE, garble_wahwah, SPEECH_FLAG_VERBALEM },
  { "blahblah", "Interjects blah blah into the player's shouts", false, GARBLE_SCOPE_EVERYONE, garble_blahblah, SPEECH_FLAG_SHOUT },
  { "drunk", "Makes the character talk (and view room) drunkenly", true, GARBLE_SCOPE_EVERYONEANDSELF, garble_drunk, SPEECH_FLAG_VERBAL | SPEECH_FLAG_ROOMDESC },
  { "pg13out", "Makes the character tone down their swear words (to other people)", true, GARBLE_SCOPE_INDIVIDUAL, garble_PG13filter, SPEECH_FLAG_NONWRITE },
  { "pg13all", "Makes the character not get or say any swear words", true, GARBLE_SCOPE_EVERYONE, garble_PG13filter, SPEECH_FLAG_NONWRITE },
  { "glubglub", "Makes the character say glub glub", true, GARBLE_SCOPE_EVERYONE, garble_glubglub, SPEECH_FLAG_VERBALEM },
  { "pirate", "Makes the character talk like a pirate", false, GARBLE_SCOPE_EVERYONE, garble_pirate, SPEECH_FLAG_VERBAL },
  { "freshprince", "Makes the character do the fresh prince of Brightmoon rap", false, GARBLE_SCOPE_EVERYONE, garble_freshprince, SPEECH_FLAG_SAY },
  { "fishtalk", "Makes the character talk like they are a fish to non-fish", false, GARBLE_SCOPE_INDIVIDUAL, garble_fishtalk, SPEECH_FLAG_VERBALEM },
  { "lolcats", "Makes the character do a lolcats talk (used for gnolls)", false, GARBLE_SCOPE_INDIVIDUAL, garble_lolcats, SPEECH_FLAG_VERBALEM },
  { "vampire", "Makes the character talk like a vampire", false, GARBLE_SCOPE_EVERYONE, garble_vampire, SPEECH_FLAG_VERBALEM },
  { "igor", "Makes the character talk like an igor", false, GARBLE_SCOPE_EVERYONE, garble_igor, SPEECH_FLAG_VERBALEM },
  { "olddrunk", "Makes the character talk in the old-school drunk code", false, GARBLE_SCOPE_EVERYONEANDSELF, garble_olddrunk, SPEECH_FLAG_VERBAL | SPEECH_FLAG_ROOMDESC },
  { "irish", "Makes the character talk with an irish accent", false, GARBLE_SCOPE_EVERYONE, garble_irish, SPEECH_FLAG_VERBALEM },
  { "trolltalk", "Makes the character talk like a troll to non-trolls", false, GARBLE_SCOPE_INDIVIDUAL, garble_trolltalk, SPEECH_FLAG_VERBALEM },
  { "frogtalk", "Makes the character talk like a frogman to non-frogs", false, GARBLE_SCOPE_INDIVIDUAL, garble_frogtalk, SPEECH_FLAG_VERBALEM },
  { "birdtalk", "Makes the character talk like an aarakocra to non-aarakocra", false, GARBLE_SCOPE_INDIVIDUAL, garble_birdtalk, SPEECH_FLAG_VERBALEM },
  { "gutter", "Makes the character talk a bit cockney (used for goblins and orcs)", false, GARBLE_SCOPE_INDIVIDUAL, garble_gutter, SPEECH_FLAG_VERBALEM },
  { "trogtalk", "Makes the character talk like a troglodyte to non-trogs", false, GARBLE_SCOPE_INDIVIDUAL, garble_trogtalk, SPEECH_FLAG_VERBALEM },
  { "crazyfrog", "Like frogtalk, except it effects rooms as well", false, GARBLE_SCOPE_EVERYONEANDSELF, garble_frogtalk, SPEECH_FLAG_VERBALEM | SPEECH_FLAG_ROOMDESC},
};

// gets the garbles that will apply to this character (adds automatic ones)
int TBeing::getGarbles(TBeing *to) const
{
  int garbleFlags = my_garbleFlags;

  if (getCond(DRUNK) >= 9)
    garbleFlags |= GARBLE_FLAG_DRUNK;

  if (getSkillValue(SKILL_SIGN) < MAX_SKILL_LEARNEDNESS)
    garbleFlags |= GARBLE_FLAG_SIGN;

  if ((roomp->isUnderwaterSector() || hasDisease(DISEASE_DROWNING)) &&
      !isImmortal() && !isShopkeeper() && !isAffected(AFF_WATERBREATH) &&
      getImmunity(IMMUNE_SUFFOCATION) < 100 && (!to || !to->isImmortal()))
  {
    garbleFlags |= GARBLE_FLAG_GLUBGLUB;
  }

  if (desc && IS_SET(desc->autobits, AUTO_PG13))
    garbleFlags |= GARBLE_FLAG_PG13IN;

  if (to && to->desc && IS_SET(to->desc->autobits, AUTO_PG13))
    garbleFlags |= GARBLE_FLAG_PG13OUT;

  if (hasQuestBit(TOG_BLAHBLAH))
    garbleFlags |= GARBLE_FLAG_BLAHBLAH;

  if (to && to->getMyRace()->getGarbles() != getMyRace()->getGarbles() &&
    to->getStat(STAT_CURRENT, STAT_INT) < 180)
  {
    garbleFlags |= getMyRace()->getGarbles();
  }

  return garbleFlags;
}

// toggles whatever garble on this character - note only blahblah is persisted
// and many are set automatically anyway (sign, drunk, pg13, glubglub)
// adding an automatic will just make it always on for that character
// toggling off an automatic will turn it off, unless they are in a situation where they'd
// get it on automatically (like say they were drunk and you toggled off garble_trunk)
int TBeing::toggleGarble(GARBLETYPE garble)
{
  int garbles = my_garbleFlags;

  if (hasQuestBit(TOG_BLAHBLAH))
    garbles |= GARBLE_FLAG_BLAHBLAH;
  if (desc && IS_SET(desc->autobits, AUTO_PG13))
    garbles |= GARBLE_PG13OUT;

  garbles ^= (1<<garble);

  my_garbleFlags = garbles;

  if ((my_garbleFlags & GARBLE_FLAG_PG13OUT) && desc && !IS_SET(desc->autobits, AUTO_PG13))
    SET_BIT(desc->autobits, AUTO_PG13);
  else if (!(my_garbleFlags & GARBLE_FLAG_PG13OUT) && desc && IS_SET(desc->autobits, AUTO_PG13))
    REMOVE_BIT(desc->autobits, AUTO_PG13);

  if ((my_garbleFlags & GARBLE_FLAG_BLAHBLAH) && !hasQuestBit(TOG_BLAHBLAH))
    setQuestBit(TOG_BLAHBLAH);
  else if (!(my_garbleFlags & GARBLE_FLAG_BLAHBLAH) && hasQuestBit(TOG_BLAHBLAH))
    remQuestBit(TOG_BLAHBLAH);

  return my_garbleFlags;
}

// applies all of the proper garbles
sstring TBeing::garble(TBeing *to, const sstring &arg, SPEECHTYPE speechType, GARBLESCOPE garbleScope) const
{
  if (arg.empty())
    return "";

  sstring garbled = arg;
  int garbleFlags = getGarbles(to);

  // no garbles if you are telling to an immortal
  // no garbles applied? just return the string
  if (!garbleFlags || (to && to->isImmortal()))
    return garbled;

  // run all of my applied garbles, in order
  // check if garble applies to this speechtype
  for(int iGarble = 0;iGarble < GARBLE_MAX;iGarble++)
  {
    // skip if this garble isnt included from the flags
    if (!(1<<iGarble & garbleFlags))
      continue;

    // skip this garble if it is not scoped to our target scope
    if (!(garbleScope & GarbleData[iGarble].scope))
      continue;

    // skip if this speechtype doesnt match the given garble's set of speechtypes
    if (!((1<<speechType) & GarbleData[iGarble].speechFlags))
      continue;

    garbled = GarbleData[iGarble].garbleFunction(this, to, garbled, speechType);
  }

  return garbled;
}

// Deal with whiney bitches
sstring garble_blahblah(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType)
{
  sstring obuf, buf, blah, word;
  unsigned int loc;
  buf=obuf=arg;

  for(int i=0;!arg.word(i).empty();++i)
  {
    word=arg.word(i);

    // remove color codes at the beginning<commit_msg>-Check yo' string befo' you wrek sumthin'<commit_after>//////////////////////////////////////////////////////////////////////////
//
// SneezyMUD - All rights reserved, SneezyMUD Coding Team
//
// Garble.cc
// Code for changing how players talk
//////////////////////////////////////////////////////////////////////////

#include "stdsneezy.h"
#include "garble.h"

// utility functions defined below
const sstring RandomPhrase(bool allowRecursivePhrase);

// Garble functions - defined here so peeps dont reference them outside of this file
sstring garble_blahblah(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_PG13filter(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_drunk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_sign(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_innuendo(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_excited(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_glubglub(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_ghost(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_wahwah(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_pirate(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_freshprince(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_fishtalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_lolcats(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_vampire(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_igor(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_olddrunk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_irish(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_trolltalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_frogtalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_birdtalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_gutter(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);
sstring garble_trogtalk(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType);

TGarble GarbleData[GARBLE_MAX] = {
  { "innuendo", "Makes the character end sentences, if you know what I mean", false, GARBLE_SCOPE_EVERYONE, garble_innuendo, SPEECH_FLAG_VERBAL },
  { "excited", "Makes the character end phrases with exclamations!!", false, GARBLE_SCOPE_EVERYONE, garble_excited, SPEECH_FLAG_VERBAL },
  { "sign", "Applies to signing, if the character's skill level < maxed", true, GARBLE_SCOPE_EVERYONE, garble_sign, SPEECH_FLAG_SIGN },
  { "ghost", "Makes the character talk OOooooo scary!", false, GARBLE_SCOPE_EVERYONE, garble_ghost, SPEECH_FLAG_VERBALEM },
  { "wahwah", "Makes the character cry like a little baby", false, GARBLE_SCOPE_EVERYONE, garble_wahwah, SPEECH_FLAG_VERBALEM },
  { "blahblah", "Interjects blah blah into the player's shouts", false, GARBLE_SCOPE_EVERYONE, garble_blahblah, SPEECH_FLAG_SHOUT },
  { "drunk", "Makes the character talk (and view room) drunkenly", true, GARBLE_SCOPE_EVERYONEANDSELF, garble_drunk, SPEECH_FLAG_VERBAL | SPEECH_FLAG_ROOMDESC },
  { "pg13out", "Makes the character tone down their swear words (to other people)", true, GARBLE_SCOPE_INDIVIDUAL, garble_PG13filter, SPEECH_FLAG_NONWRITE },
  { "pg13all", "Makes the character not get or say any swear words", true, GARBLE_SCOPE_EVERYONE, garble_PG13filter, SPEECH_FLAG_NONWRITE },
  { "glubglub", "Makes the character say glub glub", true, GARBLE_SCOPE_EVERYONE, garble_glubglub, SPEECH_FLAG_VERBALEM },
  { "pirate", "Makes the character talk like a pirate", false, GARBLE_SCOPE_EVERYONE, garble_pirate, SPEECH_FLAG_VERBAL },
  { "freshprince", "Makes the character do the fresh prince of Brightmoon rap", false, GARBLE_SCOPE_EVERYONE, garble_freshprince, SPEECH_FLAG_SAY },
  { "fishtalk", "Makes the character talk like they are a fish to non-fish", false, GARBLE_SCOPE_INDIVIDUAL, garble_fishtalk, SPEECH_FLAG_VERBALEM },
  { "lolcats", "Makes the character do a lolcats talk (used for gnolls)", false, GARBLE_SCOPE_INDIVIDUAL, garble_lolcats, SPEECH_FLAG_VERBALEM },
  { "vampire", "Makes the character talk like a vampire", false, GARBLE_SCOPE_EVERYONE, garble_vampire, SPEECH_FLAG_VERBALEM },
  { "igor", "Makes the character talk like an igor", false, GARBLE_SCOPE_EVERYONE, garble_igor, SPEECH_FLAG_VERBALEM },
  { "olddrunk", "Makes the character talk in the old-school drunk code", false, GARBLE_SCOPE_EVERYONEANDSELF, garble_olddrunk, SPEECH_FLAG_VERBAL | SPEECH_FLAG_ROOMDESC },
  { "irish", "Makes the character talk with an irish accent", false, GARBLE_SCOPE_EVERYONE, garble_irish, SPEECH_FLAG_VERBALEM },
  { "trolltalk", "Makes the character talk like a troll to non-trolls", false, GARBLE_SCOPE_INDIVIDUAL, garble_trolltalk, SPEECH_FLAG_VERBALEM },
  { "frogtalk", "Makes the character talk like a frogman to non-frogs", false, GARBLE_SCOPE_INDIVIDUAL, garble_frogtalk, SPEECH_FLAG_VERBALEM },
  { "birdtalk", "Makes the character talk like an aarakocra to non-aarakocra", false, GARBLE_SCOPE_INDIVIDUAL, garble_birdtalk, SPEECH_FLAG_VERBALEM },
  { "gutter", "Makes the character talk a bit cockney (used for goblins and orcs)", false, GARBLE_SCOPE_INDIVIDUAL, garble_gutter, SPEECH_FLAG_VERBALEM },
  { "trogtalk", "Makes the character talk like a troglodyte to non-trogs", false, GARBLE_SCOPE_INDIVIDUAL, garble_trogtalk, SPEECH_FLAG_VERBALEM },
  { "crazyfrog", "Like frogtalk, except it effects rooms as well", false, GARBLE_SCOPE_EVERYONEANDSELF, garble_frogtalk, SPEECH_FLAG_VERBALEM | SPEECH_FLAG_ROOMDESC},
};

// gets the garbles that will apply to this character (adds automatic ones)
int TBeing::getGarbles(TBeing *to) const
{
  int garbleFlags = my_garbleFlags;

  if (getCond(DRUNK) >= 9)
    garbleFlags |= GARBLE_FLAG_DRUNK;

  if (getSkillValue(SKILL_SIGN) < MAX_SKILL_LEARNEDNESS)
    garbleFlags |= GARBLE_FLAG_SIGN;

  if ((roomp->isUnderwaterSector() || hasDisease(DISEASE_DROWNING)) &&
      !isImmortal() && !isShopkeeper() && !isAffected(AFF_WATERBREATH) &&
      getImmunity(IMMUNE_SUFFOCATION) < 100 && (!to || !to->isImmortal()))
  {
    garbleFlags |= GARBLE_FLAG_GLUBGLUB;
  }

  if (desc && IS_SET(desc->autobits, AUTO_PG13))
    garbleFlags |= GARBLE_FLAG_PG13IN;

  if (to && to->desc && IS_SET(to->desc->autobits, AUTO_PG13))
    garbleFlags |= GARBLE_FLAG_PG13OUT;

  if (hasQuestBit(TOG_BLAHBLAH))
    garbleFlags |= GARBLE_FLAG_BLAHBLAH;

  if (to && to->getMyRace()->getGarbles() != getMyRace()->getGarbles() &&
    to->getStat(STAT_CURRENT, STAT_INT) < 180)
  {
    garbleFlags |= getMyRace()->getGarbles();
  }

  return garbleFlags;
}

// toggles whatever garble on this character - note only blahblah is persisted
// and many are set automatically anyway (sign, drunk, pg13, glubglub)
// adding an automatic will just make it always on for that character
// toggling off an automatic will turn it off, unless they are in a situation where they'd
// get it on automatically (like say they were drunk and you toggled off garble_trunk)
int TBeing::toggleGarble(GARBLETYPE garble)
{
  int garbles = my_garbleFlags;

  if (hasQuestBit(TOG_BLAHBLAH))
    garbles |= GARBLE_FLAG_BLAHBLAH;
  if (desc && IS_SET(desc->autobits, AUTO_PG13))
    garbles |= GARBLE_PG13OUT;

  garbles ^= (1<<garble);

  my_garbleFlags = garbles;

  if ((my_garbleFlags & GARBLE_FLAG_PG13OUT) && desc && !IS_SET(desc->autobits, AUTO_PG13))
    SET_BIT(desc->autobits, AUTO_PG13);
  else if (!(my_garbleFlags & GARBLE_FLAG_PG13OUT) && desc && IS_SET(desc->autobits, AUTO_PG13))
    REMOVE_BIT(desc->autobits, AUTO_PG13);

  if ((my_garbleFlags & GARBLE_FLAG_BLAHBLAH) && !hasQuestBit(TOG_BLAHBLAH))
    setQuestBit(TOG_BLAHBLAH);
  else if (!(my_garbleFlags & GARBLE_FLAG_BLAHBLAH) && hasQuestBit(TOG_BLAHBLAH))
    remQuestBit(TOG_BLAHBLAH);

  return my_garbleFlags;
}

// applies all of the proper garbles
sstring TBeing::garble(TBeing *to, const sstring &arg, SPEECHTYPE speechType, GARBLESCOPE garbleScope) const
{
  if (arg.empty())
    return "";

  sstring garbled = arg;
  int garbleFlags = getGarbles(to);

  // no garbles if you are telling to an immortal
  // no garbles applied? just return the string
  if (!garbleFlags || (to && to->isImmortal()))
    return garbled;

  // run all of my applied garbles, in order
  // check if garble applies to this speechtype
  for(int iGarble = 0;!garbled.empty() && iGarble < GARBLE_MAX;iGarble++)
  {
    // skip if this garble isnt included from the flags
    if (!(1<<iGarble & garbleFlags))
      continue;

    // skip this garble if it is not scoped to our target scope
    if (!(garbleScope & GarbleData[iGarble].scope))
      continue;

    // skip if this speechtype doesnt match the given garble's set of speechtypes
    if (!((1<<speechType) & GarbleData[iGarble].speechFlags))
      continue;

    garbled = GarbleData[iGarble].garbleFunction(this, to, garbled, speechType);
  }

  return garbled;
}

// Deal with whiney bitches
sstring garble_blahblah(const TBeing *from, const TBeing *to, const sstring &arg, SPEECHTYPE speechType)
{
  sstring obuf, buf, blah, word;
  unsigned int loc;
  buf=obuf=arg;

  for(int i=0;!arg.word(i).empty();++i)
  {
    word=arg.word(i);

    // remove color codes at the beginning
{'fraction_non_alphanumeric': 0.11413370809074483, 'fraction_numerical': 0.004818309576390283, 'mean_word_length': 5.06544901065449, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 39, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3571113', 'n_tokens_mistral': 7430, 'n_tokens_neox': 6987, 'n_words': 1950}