-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmigrate.py
More file actions
109 lines (87 loc) · 3.84 KB
/
migrate.py
File metadata and controls
109 lines (87 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""
AddressTrackerBot v3 - One-time JSON to SQLite migration.
Reads existing addresses.json and users.json, inserts into SQLite.
First user becomes admin. Renames JSON files to .bak after migration.
"""
import os
import json
import sys
from config import BASE_DIR
from utils import logger
from database import init_db, add_user, add_address, get_user
ADDRESSES_FILE = os.path.join(BASE_DIR, 'addresses.json')
USERS_FILE = os.path.join(BASE_DIR, 'users.json')
def migrate():
"""Run the JSON-to-SQLite migration."""
print("AddressTrackerBot v3 - Migration Tool")
print("=" * 40)
# Initialize database (creates tables if needed)
init_db()
migrated_users = 0
migrated_addresses = 0
# Migrate users.json
if os.path.exists(USERS_FILE):
print(f"\nFound {USERS_FILE}")
try:
with open(USERS_FILE, 'r') as f:
data = json.load(f)
users = data.get('users', [])
for i, user in enumerate(users):
chat_id = user.get('chat_id')
username = user.get('username', 'unknown')
if chat_id is None:
continue
is_admin = (i == 0) # First user becomes admin
if add_user(chat_id, username, is_admin):
role = "admin" if is_admin else "user"
print(f" Migrated user: {username} (chat_id={chat_id}) as {role}")
migrated_users += 1
else:
# User might already exist
existing = get_user(chat_id)
if existing:
print(f" User already exists: {username} (chat_id={chat_id})")
# Rename to .bak
bak_path = USERS_FILE + '.bak'
os.rename(USERS_FILE, bak_path)
print(f" Renamed {USERS_FILE} -> {bak_path}")
except (json.JSONDecodeError, IOError) as e:
print(f" Error reading {USERS_FILE}: {e}")
logger.error(f"Migration error reading users.json: {e}")
else:
print(f"\nNo {USERS_FILE} found (skipping user migration)")
# Migrate addresses.json
if os.path.exists(ADDRESSES_FILE):
print(f"\nFound {ADDRESSES_FILE}")
try:
with open(ADDRESSES_FILE, 'r') as f:
addresses_by_user = json.load(f)
for chat_id_str, user_addresses in addresses_by_user.items():
chat_id = int(chat_id_str)
# Ensure user exists in DB
if not get_user(chat_id):
add_user(chat_id, f"user_{chat_id}", is_admin=False)
print(f" Created user entry for chat_id={chat_id}")
for name, info in user_addresses.items():
eth_address = info.get('ether_address', '')
last_block = info.get('last_seen_block', 0)
if add_address(chat_id, 1, eth_address, name, last_block):
print(f" Migrated address: {name} ({eth_address[:10]}...)")
migrated_addresses += 1
else:
print(f" Address already exists or error: {name}")
# Rename to .bak
bak_path = ADDRESSES_FILE + '.bak'
os.rename(ADDRESSES_FILE, bak_path)
print(f" Renamed {ADDRESSES_FILE} -> {bak_path}")
except (json.JSONDecodeError, IOError) as e:
print(f" Error reading {ADDRESSES_FILE}: {e}")
logger.error(f"Migration error reading addresses.json: {e}")
else:
print(f"\nNo {ADDRESSES_FILE} found (skipping address migration)")
print(f"\nMigration complete!")
print(f" Users migrated: {migrated_users}")
print(f" Addresses migrated: {migrated_addresses}")
print(f" Database: {os.path.join(BASE_DIR, 'tracker.db')}")
if __name__ == '__main__':
migrate()