Przejdź do głównej zawartości

Przejście z innego telefonu

Miasto, które już ma telefon, ma w nim lata rzeczy: numery wyuczone na pamięć, rozmowy, zdjęcia, @handles. Utrata tego wszystkiego to prawdziwa cena zmiany telefonu i powód, dla którego większość serwerów nigdy tego nie robi. To narzędzie odczytuje tabele starego telefonu i zapisuje nasze.

Można przejść z czterech telefonów i wszystkie cztery są testowane w ten sam sposób: ich własne tabele są tworzone ze schematu dostarczanego przez ich instalator, zapisywane jest w nich małe miasto, import jest uruchamiany naprawdę, a każdy wiersz, który deklaruje, że przeniósł, jest potem sprawdzany.

ZJego tabeleCzym klucz wszystko
lb-phonephone_*numer telefonu, a phone_phones zamienia go na właściciela
Quasar Smartphone Proqs_phone_*scope_id — jeden telefon, a nie jedna osoba
NPWDnpwd_*identyfikator frameworka, a jego numery są już w users
qb-phoneplayer_contacts, phone_messages…citizenid, który na QBCore jest właścicielem tego telefonu

Nigdy nie dotyka starego telefonu. Ani jedno polecenie nie zapisuje do tabeli, która nie jest nasza. Dane lb-phone są potem dokładnie takie, jakie były, i dlatego droga powrotna jest prosta: usuń nasze wiersze.

Próba jest prawdziwa. DryRun jest domyślnie włączony. Odczytuje wszystko, co odczytuje prawdziwe uruchomienie, wylicza każdy wiersz, który by zapisał, nie zapisuje żadnego i wypisuje liczbę. To ten sam kod — próba, która poszła na skróty, byłaby próbą niczego.

Nie może się zdarzyć dwa razy. Prawdziwe uruchomienie zostawia w bazie danych potwierdzenie. Następny start je znajduje i się zatrzymuje, ponieważ jedna zapomniana linijka configu zduplikowałaby w przeciwnym razie każdą rozmowę w mieście.

-- shared/config/import.lua
Config.Import = {
From = 'lb-phone', -- or false, which is where it starts
DryRun = true, -- read the count first
Numbers = 'keep', -- their old numbers move across
Crypto = 'cash', -- sell their coins at their own price
}

Zrestartuj raz i przeczytaj konsolę:

[mic_phone import] lb-phone — REHEARSAL, nothing was written
[mic_phone import] contacts 482
[mic_phone import] messages 19104
[mic_phone import] numbers 137
[mic_phone import] photos 2210
[mic_phone import] social 96
[mic_phone import] · a phone whose owner is not in `users` any more was skipped (×8)
[mic_phone import] · lb-phone does not say whether an alarm repeats, so its alarms arrive as one-off alarms

Potem DryRun = false, zrestartuj jeszcze raz, a na koniec ustaw From = false.

Jeśli tabel nie ma w tej bazie danych, narzędzie to mówi i nic nie robi, więc wskazanie złego telefonu kosztuje Cię jedną linijkę w konsoli.

Wszystko poniżej dotyczy lb-phone, który jest najpełniejszy z czterech. To, co robią inne, inaczej, znajduje się niżej.

Z lb-phoneStaje się
phone_phonesnumer w users, bateria, ustawienia telefonu
jego settings.appsEkran główny — ten sam dock, te same aplikacje na tych samych stronach
phone_phone_contactskontakty, z ulubionymi i zdjęciami
phone_message_*rozmowy, grupy i liczniki nieprzeczytanych
phone_phone_callsostatnie, jeden wiersz na stronę, w tym nieodebrane
phone_photosbiblioteka, zdjęcia i filmy
phone_mail_*poczta, przeczytana i nieprzeczytana
phone_maps_locationszapisane miejsca
phone_marketplace_posts, phone_yellow_pages_postsogłoszenia
Instagram, Twitter, TikTok, TinderInstapic, Twixel, Klipz, Flinder — handle, nazwy, zdjęcia, bio, posty, obserwowani i znacznik weryfikacji
phone_darkchat_*darknet: pokój, kto w nim był, co zostało powiedziane
phone_notes, phone_clock_alarmsnotatki i budziki — budziki lb-phone nie mówią, czy się powtarzają, więc przychodzą jako budziki jednorazowe
phone_cryptozobacz Krypto niżej

Obrazy są adresami URL w obu telefonach, więc nic nie jest pobierane ani wysyłane ponownie. Zdjęcia gracza działają pierwszego dnia, bo nigdy nie należały do żadnego z tych telefonów.

Raport mówi o każdej z tych rzeczy na głos, zamiast zostawiać komuś ich zauważanie.

  • Tapety i dzwonki. Ich nazywają własne pliki, nasze nazywają nasze. Zły obraz jest gorszy niż domyślny.
  • Hasła do kont społecznościowych. Zobacz niżej — konta się przenoszą, haseł nie da się.
  • Tryb samolotowy, celowo. Zaimportowanie przełącznika, który ktoś zostawił włączony, to zaimportowanie telefonu, który nie działa, i gracza, który nie wie dlaczego.
  • Albumy ze zdjęciami. Każde zdjęcie jest w bibliotece; albumy nie są odtwarzane.

Najlepiej zbudowany z czterech, a mapowanie jest dokładne, a nie przybliżone, w trzech miejscach:

  • Liczniki nieprzeczytanych są przeliczane, a nie kopiowane. Quasar przechowuje last_read_message_id; nasz przechowuje liczbę. Liczba jest więc wyliczana — ile wiadomości w tej rozmowie przyszło po tej, którą ostatnio przeczytali — co jest poprawne nawet wtedy, gdy ich własny licznik się rozjechał.
  • Ostatnie już mówią incoming, outgoing i missed, a to są nasze trzy słowa.
  • Zdjęcie wie, że jest filmem, wraz z jego długością i plakatem, więc przychodzi jako film.

Przychodzą też notatki (przypięte pozostają przypięte), budziki, wpisy w kalendarzu i przypomnienia: otwarte przypomnienie z terminem staje się wpisem w kalendarzu, to bez daty zachowuje swoje słowa jako notatka, a zakończone zostaje w tyle. Quasar potrafi powtarzać budzik tylko w weekendy, czego ten telefon nie potrafi, więc te przychodzą jako budziki jednorazowe.

Przypięte i wyciszone rozmowy zachowują oba stany. Poczta przychodzi z folderem, w którym była — wersje robocze i kosz zostają w tyle, bo wersja robocza, której nikt nie wysłał, nie jest warta przenoszenia. Czego nie ma: ich ustawienia i ekran główny, które żyją w blobie JSON o własnym kształcie Quasara, oraz ich identyfikatory App Store, które nie są nasze.

Jedna rzecz, o której warto wiedzieć: Quasar pozwala postaci mieć więcej niż jeden telefon, a ten trzyma jeden numer na postać. Pierwszy numer, który wyląduje, jest ich; każdy inny jest wymieniony w raporcie i nic nie jest nadpisywane.

Najłatwiejszy, z powodu, który warto powiedzieć na głos: NPWD trzyma numer już w users.phone_number, czyli w tej samej kolumnie, którą czyta ten telefon. Na domyślnym serwerze NPWD nie ma niczego do przeniesienia, a raport tak mówi, zamiast udawać pracę.

Jego rozmowy są nazwane ciągiem numerów, które w nich występują, a nie identyfikatorem, więc złączenie odbywa się po tym ciągu. Nazwa profilu w jego Twitterze staje się @handle; Match nie ma w ogóle nazwy użytkownika, więc konto Flinder jest kluczowane numerem postaci. Zdjęcia nie mają własnej daty, więc biblioteka jest datowana kolejnością ich zrobienia. Jego notatki przychodzą tak samo, datowane kolejnością ich napisania. Ogłoszenia nie mają ceny i przychodzą z zerem.

Najstarszy i najmniej do nas podobny — ale tożsamość jest za darmo, ponieważ na QBCore ten telefon już używa citizenid, którym qb-phone kluczuje wszystko.

Jego rozmowy to właśnie praca. qb-phone nie ma rozmów: phone_messages to jeden wiersz na osobę na numer z całą wymianą jako tablicą JSON, zapisywaną z każdej strony osobno. Ta sama rozmowa istnieje więc dwa razy, a obie kopie nie muszą się zgadzać. Każda para numerów jest zatem budowana raz, z tej strony, w której jest więcej — scalanie wymyśliłoby kolejność, a importowanie obu dałoby każdemu każdą wiadomość dwa razy. Rozmowa bez znaczników czasu zachowuje swoją kolejność i jest rozłożona w odstępach co minutę.

Numery żyją w players.charinfo jako JSON, a nie w kolumnie, więc są stamtąd odczytywane i zapisywane tam, gdzie trzyma je ten telefon. Jego tweety niosą nazwę, a nie konto, więc na każdą postać tworzone jest jedno konto Twixel z jej nazwy.

Numbers = 'keep' to sedno całego przedsięwzięcia: numer na czyjejś wizytówce i w kontaktach wszystkich innych nadal do niego dociera.

Numer jest zapisywany zawsze tylko do pustej kolumny. Jeśli postać już ma tu numer i jest to inny numer, to jest kolizja: jest zliczana, wymieniona w raporcie i nic nie jest nadpisywane. Ich stare numery zachowują też swój stary kształt — 1234567890, a nie 555-###-#### tego telefonu — co jest kosmetyczne i dotyczy tylko numerów przydzielanych od tej pory.

Numbers = 'ours' zostawia je w spokoju i pozwala temu telefonowi przydzielać własne. Ich stare kontakty nie będą wskazywać na nikogo, więc jest to tylko dla miasta zaczynającego od nowa.

Ich hasła są zwykłym tekstem w kolumnie. Nasze to hash PBKDF2 wykonany w przeglądarce gracza i jednego nie da się wyliczyć z drugiego — więc hasło to jedyna rzecz, która się nie przenosi, i nie jest nigdzie zapisywane po drodze.

Konto przychodzi oznaczone jako zaimportowane. Gdy jego właściciel pierwszy raz otworzy aplikację, telefon mówi To konto przeszło ze starego telefonu. Wybierz dla niego hasło, i to jest nowe hasło.

Jest to bezpieczne z lepszego powodu niż byłoby hasło: wiersz wskazuje właściciela, a serwer wie, kto pyta, bez konieczności mówienia mu o tym. Hasło, które nigdy nie było nasze, niczego nie dowodzi.

Między dwoma wymyślonymi rynkami nie ma uczciwego kursu wymiany, więc wybierz, co się stanie, zamiast pozwalać, by to zgadywano:

  • 'cash' — sprzedaj po własnej cenie starego telefonu i zapisz to w portfelu jako ruch. Nikt nie zyskuje, nikt nie traci i nic nie trzeba uzgadniać.
  • 'skip' — pomiń. Ich udziały zostają w ich tabelach i można je załatwić ręcznie.
  • tabela — Twoje własne mapowanie, gdy udziały mają przetrwać jako monety:
Crypto = { qbit = 'santo', lifeinvader = 'vine' },

Nic ze starego telefonu nie zostało ruszone, więc:

  1. Usuń nasze wiersze dla kroku, który był zły — raport je nazywa.
  2. Usuń potwierdzenie: DELETE FROM mic_phone_json WHERE owner = '@import'.
  3. Config.Import.Again = true i zacznij od nowa.

Skip pomija pojedyncze kroki według nazw, które wypisuje raport:

Skip = { 'photos', 'crypto' },