ptgc
MTProto client for Dart

Permanent & Temporary Bans

Part of the Examples. The difference between a permanent ban and a time-boxed one.

Source: example/20_permanent_and_temporary_ban.dart

// ignore_for_file: file_names, avoid_print

// ============================================================================
// 20 — PERMANENT AND TEMPORARY BANS
// ============================================================================
//
// 03_ban_kick_restrict.dart leaves the permanent ban commented out. This
// example runs both forms explicitly: a temporary ban that lifts itself,
// and a permanent one you have to unban() yourself — plus how to tell
// which kind is currently active on a member.
//
// HOW TO RUN:
//   1. Edit groupUsername and memberUsername below.
//   2. dart run example/20_permanent_and_temporary_ban.dart
// ============================================================================

import 'package:ptgc/ptgc.dart';

const groupUsername = 'your_group_here';
const memberUsername = 'someone_here';

Future<void> main() async {
  final client = TelegramClient.fromEnv();
  await client.connect();

  if (!client.isSignedIn) {
    print('Not logged in — run 01_login.dart first.');
    await client.disconnect();
    return;
  }

  final group = await client.chats.resolveUsername(groupUsername);
  final member = await client.contacts.resolveUsername(memberUsername);
  if (group == null || member == null) {
    print('Could not resolve $groupUsername or $memberUsername.');
    await client.disconnect();
    return;
  }

  // Temporary: lifts itself after 5 minutes. Telegram treats anything
  // under 30 seconds as permanent, so this is close to the practical floor.
  final until = DateTime.now().add(const Duration(minutes: 5));
  await client.members.ban(group.id, member.id, until: until);
  var status = await client.members.get(group.id, member.id);
  print('Banned until ${status?.bannedRights?.until} (temporary).');

  await client.members.unban(group.id, member.id);
  print('Unbanned early.');

  // Permanent: no `until` at all — stays banned until you explicitly
  // unban() them, even if they try to rejoin via invite link.
  await client.members.ban(group.id, member.id);
  status = await client.members.get(group.id, member.id);
  print(
      'Banned until: ${status?.bannedRights?.until ?? "forever (permanent)"}.');

  await client.members.unban(group.id, member.id);
  print('Unbanned — reversing the permanent ban.');

  await client.disconnect();
}

Run it from the package root:

dart run example/20_permanent_and_temporary_ban.dart