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.
| Z | Jego tabele | Czym klucz wszystko |
|---|---|---|
| lb-phone | phone_* | numer telefonu, a phone_phones zamienia go na właściciela |
| Quasar Smartphone Pro | qs_phone_* | scope_id — jeden telefon, a nie jedna osoba |
| NPWD | npwd_* | identyfikator frameworka, a jego numery są już w users |
| qb-phone | player_contacts, phone_messages… | citizenid, który na QBCore jest właścicielem tego telefonu |
Trzy obietnice
Dział zatytułowany „Trzy obietnice”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.
Jak to zrobić
Dział zatytułowany „Jak to zrobić”-- shared/config/import.luaConfig.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 alarmsPotem 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.
Co się przenosi
Dział zatytułowany „Co się przenosi”Wszystko poniżej dotyczy lb-phone, który jest najpełniejszy z czterech. To, co robią inne, inaczej, znajduje się niżej.
| Z lb-phone | Staje się |
|---|---|
phone_phones | numer w users, bateria, ustawienia telefonu |
jego settings.apps | Ekran główny — ten sam dock, te same aplikacje na tych samych stronach |
phone_phone_contacts | kontakty, z ulubionymi i zdjęciami |
phone_message_* | rozmowy, grupy i liczniki nieprzeczytanych |
phone_phone_calls | ostatnie, jeden wiersz na stronę, w tym nieodebrane |
phone_photos | biblioteka, zdjęcia i filmy |
phone_mail_* | poczta, przeczytana i nieprzeczytana |
phone_maps_locations | zapisane miejsca |
phone_marketplace_posts, phone_yellow_pages_posts | ogłoszenia |
| Instagram, Twitter, TikTok, Tinder | Instapic, 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_alarms | notatki i budziki — budziki lb-phone nie mówią, czy się powtarzają, więc przychodzą jako budziki jednorazowe |
phone_crypto | zobacz 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.
Co się nie przenosi i dlaczego
Dział zatytułowany „Co się nie przenosi i dlaczego”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.
Pozostałe trzy i czym każdy się różni
Dział zatytułowany „Pozostałe trzy i czym każdy się różni”Quasar Smartphone Pro
Dział zatytułowany „Quasar Smartphone Pro”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,outgoingimissed, 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.
qb-phone
Dział zatytułowany „qb-phone”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.
Konta społecznościowe
Dział zatytułowany „Konta społecznościowe”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' },Gdy coś pójdzie nie tak
Dział zatytułowany „Gdy coś pójdzie nie tak”Nic ze starego telefonu nie zostało ruszone, więc:
- Usuń nasze wiersze dla kroku, który był zły — raport je nazywa.
- Usuń potwierdzenie:
DELETE FROM mic_phone_json WHERE owner = '@import'. Config.Import.Again = truei zacznij od nowa.
Skip pomija pojedyncze kroki według nazw, które wypisuje raport:
Skip = { 'photos', 'crypto' },