Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/Nuu-maan/Filly-Discord-Token-Filler/llms.txt

Use this file to discover all available pages before exploring further.

Statistics Data Structure

The tool tracks statistics using the JoinerStats dataclass (from index.py:40-49):
@dataclass
class JoinerStats:
    total: int = 0
    joined: int = 0
    captcha: int = 0
    captcha_solved: int = 0
    failed: int = 0
    locked: int = 0
    invalid: int = 0
    current: int = 0

Field Descriptions

FieldDescriptionIncremented When
totalUnused field (defaults to 0)Never incremented in current implementation
joinedSuccessfully joined serversHTTP 200 response received
captchaCaptcha challenges encountered”captcha_sitekey” detected in response
captcha_solvedCaptchas successfully solvedSolver returns valid solution
failedFailed join attemptsGeneric errors or captcha solver failures
lockedLocked/restricted tokensHTTP 403 response received
invalidInvalid/unauthorized tokensHTTP 401 response received
currentCurrent number processedEach response handled
The total field exists in the dataclass but is never used. The console title displays total_invites (a function parameter), not stats.total.

Real-Time Console Title

The console window title updates continuously to show live statistics during execution.

Title Format

From index.py:223-239, the title is updated by a dedicated thread:
def update_title(stats: JoinerStats, done: threading.Event, total_invites: int):
    """Updates the console title with current joining statistics."""
    while not done.is_set():
        try:
            ctypes.windll.kernel32.SetConsoleTitleW(
                f"Filly | "
                f"Total: {total_invites} | "
                f"Joined: {stats.joined} | "
                f"Failed: {stats.failed} | "
                f"Captcha: {stats.captcha} ({stats.captcha_solved} solved) | "
                f"Invalid: {stats.invalid} | "
                f"Locked: {stats.locked}"
            )
            time.sleep(0.1)
        except Exception as e:
            NovaLogger.fail(f"Title Update Error: {str(e)}")
            break

Example Title

Filly | Total: 50 | Joined: 23 | Failed: 2 | Captcha: 5 (3 solved) | Invalid: 1 | Locked: 0

Update Frequency

The title refreshes every 100 milliseconds (0.1 seconds) for smooth real-time updates.

Thread Behavior

  • Runs as a daemon thread - automatically exits with main program
  • Uses a threading.Event signal to stop gracefully
  • Handles errors to prevent crashes during title updates

Final Statistics Display

When the joining process completes, a comprehensive statistics summary is displayed.

Output Format

From index.py:286-301, the final statistics appear as:
elapsed = time.time() - start_time
minutes, seconds = divmod(int(elapsed), 60)

sep_line = "=" * 50
print(f"\n{sep_line}")
print(f"{Fore.CYAN}Final Statistics:{Style.RESET_ALL}")
print(f"Joined {stats.current} Tokens in {minutes} Minutes and {seconds} Seconds")
print("\nSummary:")
print(f"- Total Processed: {Fore.CYAN}{stats.current}{Style.RESET_ALL}")
print(f"- Successfully Joined: {Fore.GREEN}{stats.joined}{Style.RESET_ALL}")
print(f"- Captcha Encountered: {Fore.YELLOW}{stats.captcha} {Fore.CYAN}({stats.captcha_solved} solved){Style.RESET_ALL}")
print(f"- Failed: {Fore.RED}{stats.failed}{Style.RESET_ALL}")
print(f"- Invalid Tokens: {Fore.RED}{stats.invalid}{Style.RESET_ALL}")
print(f"- Locked Tokens: {Fore.RED}{stats.locked}{Style.RESET_ALL}")
print(f"\n{sep_line}")

Example Output

==================================================
Final Statistics:
Joined 47 Tokens in 2 Minutes and 34 Seconds

Summary:
- Total Processed: 47
- Successfully Joined: 40
- Captcha Encountered: 8 (6 solved)
- Failed: 2
- Invalid Tokens: 3
- Locked Tokens: 2

==================================================
Press Enter to exit...

Color Coding

  • Cyan - Informational (Total Processed, Captcha count)
  • Green - Success metrics (Successfully Joined)
  • Yellow - Warnings (Captcha Encountered)
  • Red - Errors (Failed, Invalid, Locked)

Statistics Tracking Flow

Time Calculation

The tool tracks execution time from start to finish:
start_time = time.time()  # Before joining starts

# ... joining process ...

elapsed = time.time() - start_time
minutes, seconds = divmod(int(elapsed), 60)
Time is displayed as: {minutes} Minutes and {seconds} Seconds

Thread Safety

All statistics updates are thread-safe because:
  1. Python GIL - Global Interpreter Lock ensures atomic integer operations
  2. Simple Increments - Only += operations, no complex mutations
  3. Read-Only in Title - Title thread only reads, never writes
The total field represents the number of invites to process, not the tokens. The sum of joined + failed + invalid + locked should approximately equal the number of tokens processed.
No. The captcha_solved counter is only incremented when a captcha is encountered AND successfully solved. It will always be less than or equal to captcha.
Rate limited requests (HTTP 429) increment current but don’t increment any success/failure counters. These are temporary failures that may be retried.
No. The title update runs in a separate daemon thread and only performs a lightweight string formatting operation every 100ms. The impact is negligible.

Exit Statistics

After displaying final statistics, the tool:
  1. Shows “Press Enter to exit…” prompt
  2. Waits for user to press Enter key
  3. Displays “Exiting in 3 seconds…” countdown
  4. Sleeps for 3 seconds before closing
This ensures users have time to review and screenshot the final statistics before the window closes.