PICO Platform Unity SDK
Pico.Platform Namespace Reference

Classes

class  AchievementsService
 
class  ApplicationOptions
 
class  ApplicationService
 
class  AssetFileService
 
class  ChallengesService
 
class  CLIB
 
class  CommonParsers
 
class  ComplianceService
 
class  CoreService
 
class  IAPService
 
class  InviteOptions
 
class  LeaderboardService
 
class  Looper
 
class  MarshalUtil
 
class  MatchmakingOptions
 
class  MatchmakingService
 
class  Message
 
class  MessageQueue
 
class  NetworkService
 
class  NotificationService
 
class  PresenceOptions
 
class  PresenceService
 
class  PtrArray
 
class  PtrManager
 
class  RoomOptions
 
class  RoomService
 
class  RtcAudioPropertyOptions
 
class  RtcGetTokenOptions
 
class  RtcRoomOptions
 
class  RtcService
 
class  RtcStreamSyncInfoOptions
 
class  ShareMediaOptions
 
class  SportService
 
class  Task
 
class  TimeUtil
 
class  UserService
 
class  UTF8Marshaller
 

Enumerations

enum  AchievementType { Unknown = 0 , Simple = 1 , Count = 2 , Bitfield = 3 }
 
enum  AchievementWritePolicy { Unknown = 0 , Client = 1 , Server = 2 }
 
enum  KVPairType { String = 0 , Int = 1 , Double = 2 , Unknown = 3 }
 
enum  MatchmakingCriterionImportance {
  Required = 0 , High = 1 , Medium = 2 , Low = 3 ,
  Unknown = 4
}
 
enum  ChallengeCreationType { Unknown = 0 , UserCreated = 1 , DeveloperCreated = 2 }
 
enum  ChallengeVisibility { Unknown = 0 , InviteOnly = 1 , Public = 2 , Private = 3 }
 Describes who can see and join the challenge. More...
 
enum  ChallengeViewerFilter {
  Unknown = 0 , AllVisible = 1 , Participating = 2 , Invited = 3 ,
  ParticipatingOrInvited = 4
}
 
enum  LeaderboardFilterType { None = 0 , Friends = 1 , Unknown = 2 , UserIds = 3 }
 
enum  LeaderboardStartAt { Top = 0 , CenteredOnViewer = 1 , CenteredOnViewerOrTop = 2 , Unknown = 3 }
 From where to start returning leaderboard entries. More...
 
enum  RoomJoinability {
  Unknown = 0 , AreIn = 1 , AreKicked = 2 , CanJoin = 3 ,
  IsFull = 4 , NoViewer = 5 , PolicyPrevents = 6
}
 
enum  RoomJoinPolicy {
  None = 0 , Everyone = 1 , FriendsOfMembers = 2 , FriendsOfOwner = 3 ,
  InvitedUsers = 4 , Unknown = 5
}
 
enum  RoomType { Unknown = 0 , Matchmaking = 1 , Moderated = 2 , Private = 3 }
 
enum  GameInitializeResult {
  Success = 0 , Uninitialized = 1 , NetworkError = 2 , InvalidCredentials = 3 ,
  ServiceNotAvaliable = 4 , Unknown = 5 , InvalidServerAddr = 6 , DupInitialize = 7
}
 
enum  RoomMembershipLockStatus { Unknown = 0 , Lock = 1 , Unlock = 2 }
 
enum  UserOrdering { None = 0 , PresenceAlphabetical = 1 }
 
enum  AddonsType { Invalid = -1 , Durable = 0 , Consumable = 1 , Subscription = 2 }
 The type of add-on More...
 
enum  UserPresenceStatus { Unknown = 0 , OnLine = 1 , OffLine = 2 }
 Whether the user is online or offline. More...
 
enum  Gender { Unknown = 0 , Male = 1 , Female = 2 }
 User's gender.
 
enum  AssetFileDownloadCompleteStatus { Downloading = 0 , Succeed = 1 , Failed = 2 }
 
enum  CancelReason { None = 0 , UserCancelsExpiration = 1 , DeductionFailedExpired = 2 , NoMainApplicationInterest = 3 }
 The reason why the subscription is canceled. Pico.Platform.IAPService.GetSubscriptionStatus will return a subscription status structure. The cancel reason describes why the subscription is canceled. More...
 
enum  SensitiveProposal { Pass = 0 , OnlySelfVisible = 1 , UserMute = 2 , RejectSubmit = 3 }
 The strategy proposed to handle the text and the user that created the text. It's the result of Pico.Platform.ComplianceService.DetectSensitive. More...
 
enum  DetectSensitiveScene { UserName = 1 , RoomName = 2 , RoomChat = 3 }
 Describes where the text appears in the app. Used for Pico.Platform.ComplianceService.DetectSensitive. More...
 
enum  DiscountType { Invalid = -1 , Null = 0 , FreeTrial = 1 , Discount = 2 }
 
enum  EntitlementStatus {
  None = 0 , Valid = 1 , Invalid = 2 , GracePeriod = 3 ,
  Pause = 4 , Expired = 5 , Cancel = 6
}
 The entitlement status of a subscription add-on. Used for Pico.Platform.IAPService.GetSubscriptionStatus. More...
 
enum  LaunchType {
  Unknown = 0 , Normal = 1 , RoomInvite = 2 , Deeplink = 4 ,
  ChallengeInvite = 5
}
 How the app is launched. You can use it to determine how to parse Pico.Platform.Models.LaunchDetails. Please ref Pico.Platform.ApplicationService.GetLaunchDetails. More...
 
enum  LaunchResult {
  Unknown = 0 , Success = 1 , FailedRoomFull = 2 , FailedGameAlreadyStarted = 3 ,
  FailedRoomNotFound = 4 , FailedUserDeclined = 5 , FailedOtherReason = 6
}
 
enum  RtcMuteState { Off = 0 , On = 1 }
 The state of a user's local audio. More...
 
enum  RtcPauseResumeMediaType { Audio = 0 , Video = 1 , AudioAndVideo = 2 }
 The type of media to pause or resume.
 
enum  RtcMediaStreamType { Audio = 1 , Video = 2 , Both = 3 }
 The type of media stream.
 
enum  RtcEngineInitResult {
  Unknown = -999 , AlreadyInitialized = -1 , InvalidConfig = -2 , SdkNotInitialized = -3 ,
  Success = 0
}
 The result of RTC engine initialization.
 
enum  RtcEarMonitorMode { Off = 0 , On = 1 }
 The status of in-ear monitoring mode.
 
enum  RtcStreamIndex { Main = 0 , Screen = 1 }
 
enum  RtcSyncInfoStreamType { Audio = 0 }
 The type of stream sync info. The stream sync info will be uploaded to the server with the audio data.
 
enum  RtcScreenMediaType { VideoOnly = 0 , AudioOnly = 1 , VideoAndAudio = 2 }
 
enum  RtcAudioScenarioType {
  Music = 0 , HighQualityCommunication = 1 , Communication = 2 , Media = 3 ,
  GameStreaming = 4
}
 
enum  RtcAudioPlaybackDevice {
  Headset = 1 , EarPiece = 2 , SpeakerPhone = 3 , HeadsetBlueTooth = 4 ,
  HeadsetUsb = 5
}
 
enum  RtcRoomProfileType {
  Communication = 0 , LiveBroadcasting = 1 , Game = 2 , CloudGame = 3 ,
  LowLatency = 4
}
 The type of the room. More...
 
enum  RtcAudioSourceType { External = 0 , Internal = 1 }
 
enum  RtcAudioSampleRate {
  Auto = -1 , F8000 = 8000 , F16000 = 16000 , F32000 = 32000 ,
  F44100 = 44100 , F48000 = 48000
}
 
enum  RtcAudioChannel { Auto = -1 , Mono = 1 , Stereo = 2 }
 
enum  RtcColorSpace {
  Unknown = 0 , YCbCrBT601LimitedRange = 1 , YCbCrBT601FullRange = 2 , YCbCrBT709LimitedRange = 3 ,
  YCbCrBT709FullRange = 4
}
 
enum  MatchmakingStatApproach { Unknown = 0 , Trailing = 1 , Swingy = 2 }
 
enum  MessageType {
  Unknown = -1 , PlatformInitializeAndroidAsynchronous = 1 , User_GetLoggedInUser = 10000 , User_GetAccessToken = 10001 ,
  User_Get = 10002 , User_LaunchFriendRequestFlow = 10003 , User_GetLoggedInUserFriends = 10004 , User_GetNextUserArrayPage = 10005 ,
  User_GetLoggedInUserFriendsAndRooms = 10006 , User_GetAuthorizedPermissions = 10007 , User_RequestUserPermissions = 10008 , User_GetRelations = 10009 ,
  User_GetIdToken = 10010 , User_EntitlementCheck = 10011 , Notification_Rtc_OnRoomStats = 10200 , Notification_Rtc_OnJoinRoom = 10201 ,
  Notification_Rtc_OnLeaveRoom = 10202 , Notification_Rtc_OnUserLeaveRoom = 10203 , Notification_Rtc_OnUserJoinRoom = 10204 , Notification_Rtc_OnConnectionStateChange = 10205 ,
  Notification_Rtc_OnWarn = 10206 , Notification_Rtc_OnRoomWarn = 10207 , Notification_Rtc_OnRoomError = 10208 , Notification_Rtc_OnError = 10209 ,
  Notification_Rtc_OnUserStartAudioCapture = 10210 , Notification_Rtc_OnAudioPlaybackDeviceChanged = 10211 , Notification_Rtc_OnRemoteAudioPropertiesReport = 10212 , Notification_Rtc_OnLocalAudioPropertiesReport = 10213 ,
  Notification_Rtc_OnUserStopAudioCapture = 10214 , Notification_Rtc_OnUserMuteAudio = 10215 , Notification_Rtc_OnMediaDeviceStateChanged = 10216 , Notification_Rtc_OnRoomMessageReceived = 10217 ,
  Notification_Rtc_OnUserMessageReceived = 10218 , Notification_Rtc_OnTokenWillExpire = 10219 , Notification_Rtc_OnStreamSyncInfoReceived = 10220 , Notification_Rtc_OnVideoDeviceStateChanged = 10221 ,
  Notification_Rtc_OnFirstLocalVideoFrameCaptured = 10222 , Notification_Rtc_OnRoomBinaryMessageReceived = 10223 , Notification_Rtc_OnLocalVideoSizeChanged = 10224 , Notification_Rtc_OnScreenVideoFrameSendStateChanged = 10225 ,
  Notification_Rtc_OnUserBinaryMessageReceived = 10226 , Notification_Rtc_OnLocalVideoStateChanged = 10227 , Notification_Rtc_OnUserMessageSendResult = 10228 , Notification_Rtc_OnUserUnPublishScreen = 10229 ,
  Notification_Rtc_OnRoomMessageSendResult = 10230 , Notification_Rtc_OnUserPublishStream = 10231 , Notification_Rtc_OnUserUnPublishStream = 10232 , Notification_Rtc_OnUserPublishScreen = 10233 ,
  Rtc_GetToken = 10300 , Matchmaking_Browse2 = 10400 , Matchmaking_Browse2CustomPage = 10401 , Matchmaking_Cancel2 = 10402 ,
  Matchmaking_CreateAndEnqueueRoom2 = 10404 , Matchmaking_Enqueue2 = 10408 , Matchmaking_EnqueueRoom2 = 10410 , Matchmaking_GetAdminSnapshot = 10411 ,
  Matchmaking_GetStats = 10412 , Matchmaking_ReportResultInsecure = 10414 , Matchmaking_StartMatch = 10415 , Room_CreateAndJoinPrivate = 10500 ,
  Room_CreateAndJoinPrivate2 = 10501 , Room_Get = 10502 , Room_GetCurrent = 10503 , Room_GetCurrentForUser = 10504 ,
  Room_GetInvitableUsers = 10505 , Room_GetInvitableUsers2 = 10506 , Room_GetModeratedRooms = 10507 , Room_GetNextRoomArrayPage = 10508 ,
  Room_InviteUser = 10509 , Room_Join = 10510 , Room_Join2 = 10511 , Room_KickUser = 10512 ,
  Room_LaunchInvitableUserFlow = 10513 , Room_Leave = 10514 , Room_SetDescription = 10515 , Room_UpdateDataStore = 10516 ,
  Room_UpdateMembershipLockStatus = 10517 , Room_UpdateOwner = 10518 , Room_UpdatePrivateRoomJoinPolicy = 10519 , Room_JoinNamed = 10520 ,
  Room_GetNamedRooms = 10521 , Notification_Matchmaking_MatchFound = 10600 , Notification_Room_InviteAccepted = 10601 , Notification_Room_RoomUpdate = 10603 ,
  Notification_Game_ConnectionEvent = 10604 , Notification_Game_RequestFailed = 10605 , Notification_Game_StateReset = 10606 , Notification_GetNextRoomInviteNotificationArrayPage = 10607 ,
  Notification_GetRoomInvites = 10608 , Notification_MarkAsRead = 10609 , Notification_Challenge_LaunchByInvite = 10610 , PlatformGameInitializeAsynchronous = 10700 ,
  Leaderboard_Get = 10800 , Leaderboard_GetNextLeaderboardArrayPage = 10801 , Leaderboard_GetEntries = 10802 , Leaderboard_GetEntriesAfterRank = 10803 ,
  Leaderboard_GetEntriesByIds = 10804 , Leaderboard_GetNextEntries = 10805 , Leaderboard_GetPreviousEntries = 10806 , Leaderboard_WriteEntry = 10807 ,
  Leaderboard_WriteEntryWithSupplementaryMetric = 10808 , Achievements_AddCount = 10820 , Achievements_AddFields = 10821 , Achievements_GetAllDefinitions = 10822 ,
  Achievements_GetAllProgress = 10823 , Achievements_GetDefinitionsByName = 10824 , Achievements_GetNextAchievementDefinitionArrayPage = 10825 , Achievements_GetNextAchievementProgressArrayPage = 10826 ,
  Achievements_GetProgressByName = 10827 , Achievements_Unlock = 10828 , Challenges_Invite = 10850 , Challenges_Get = 10851 ,
  Challenges_GetList = 10852 , Challenges_GetEntries = 10853 , Challenges_GetEntriesAfterRank = 10854 , Challenges_GetEntriesByIds = 10855 ,
  Challenges_Join = 10856 , Challenges_Leave = 10857 , Challenges_LaunchInvitableUserFlow = 10858 , Application_LaunchOtherApp = 11001 ,
  Presence_GetSentInvites = 11002 , Presence_GetInvitableUsers = 11003 , Presence_SendInvites = 11004 , Presence_GetDestinations = 11005 ,
  Presence_Clear = 11006 , Presence_Set = 11007 , Notification_ApplicationLifecycle_LaunchIntentChanged = 11008 , Notification_Presence_JoinIntentReceived = 11009 ,
  Application_LaunchOtherAppByPresence = 11011 , Application_LaunchOtherAppByMessage = 11013 , Presence_ShareMedia = 11014 , Presence_LaunchInvitePanel = 11015 ,
  Presence_SendCustomInvites = 11016 , Application_LaunchStore = 11017 , Application_GetVersion = 11018 , IAP_GetProductsBySKU = 12001 ,
  IAP_GetViewerPurchases = 12002 , IAP_LaunchCheckoutFlow = 12003 , IAP_ConsumePurchase = 12004 , IAP_GetSubscriptionStatus = 12005 ,
  Sport_GetUserInfo = 12500 , Sport_GetDailySummary = 12501 , Sport_GetSummary = 12502 , AssetFile_DeleteById = 13001 ,
  AssetFile_DeleteByName = 13002 , AssetFile_DownloadById = 13003 , AssetFile_DownloadByName = 13004 , AssetFile_DownloadCancelById = 13005 ,
  AssetFile_DownloadCancelByName = 13006 , AssetFile_GetList = 13007 , AssetFile_StatusById = 13008 , AssetFile_StatusByName = 13009 ,
  AssetFile_GetNextAssetDetailsArrayPage = 13010 , Notification_AssetFile_DownloadUpdate = 13101 , Notification_AssetFile_DeleteForSafety = 13102 , Compliance_DetectSensitive = 15015
}
 
enum  RtcJoinRoomType { First = 0 , Reconnected = 1 }
 Whether it is the first time that the user has joined the room or if the user is reconnected to the room. More...
 
enum  RtcUserLeaveReasonType { Quit = 0 , Dropped = 1 }
 
enum  RtcMediaDeviceType { AudioUnknown = -1 , AudioRenderDevice = 0 , AudioCaptureDevice = 1 }
 The type of media(?) device. More...
 
enum  RtcMediaDeviceState {
  Started = 1 , Stopped = 2 , RuntimeError = 3 , Added = 4 ,
  Removed = 5
}
 
enum  RtcMediaDeviceError {
  Ok = 0 , NoPermission = 1 , DeviceBusy = 2 , DeviceFailure = 3 ,
  DeviceNotFound = 4 , DeviceDisconnected = 5 , DeviceNoCallback = 6 , UnSupporttedFormat = 7
}
 Types of media device errors. More...
 
enum  RtcStreamRemoveReason {
  Unpublish = 0 , PublishFailed = 1 , KeepLiveFailed = 2 , ClientDisconnected = 3 ,
  Republish = 4 , Other = 5
}
 The reason why the remote user canceled publishing stream.
 
enum  GameConnectionEvent {
  Connected = 0 , Closed = 1 , Lost = 2 , Resumed = 3 ,
  KickedByRelogin = 4 , KickedByGameServer = 5 , GameLogicError = 6 , Unknown = 7
}
 Various kinds of events that may take place in networking.
 
enum  GameRequestFailedReason {
  None = 0 , NotInitialized = 1 , Uninitialized = 2 , CurrentlyUnavailable = 3 ,
  CurrentlyUnknown = 4
}
 Various reasons for failed requests to platform game service. More...
 
enum  SportTarget { LoseFat = 0 , KeepFit = 1 }
 Users purpose of playing sports. More...
 
enum  PeriodType {
  Invalid = -1 , None = 0 , Hour = 1 , Day = 2 ,
  Week = 3 , Month = 4 , Quarter = 5 , Year = 6
}
 The period type of the subscription.
 
enum  UserRelationType {
  Unknown = 0 , IsFriend = 1 , NotFriend = 2 , Blocked = 3 ,
  BlockedBy = 4 , ApplyingFriend = 5
}
 
enum  PlatformInitializeResult {
  Unknown = -999 , NetError = -6 , MissingImpl = -5 , LoadImplFailed = -4 ,
  InternalError = -3 , InvalidParams = -2 , AlreadyInitialized = -1 , Success = 0
}
 The initialize result of Platform. More...
 
enum  ShareMediaType { Video = 0 , Image = 1 }
 The type of media to share. More...
 
enum  ShareAppType { Douyin = 0 }
 The app which the videos or screenshots are shared to. More...
 
enum  RtcPrivilege { PublishStream = 0 , PublishAudioStream = 1 , PublishVideoStream = 2 , SubscribeStream = 3 }
 
enum  RtcConnectionState {
  Disconnected = 1 , Connecting = 2 , Connected = 3 , Reconnecting = 4 ,
  Reconnected = 5 , Lost = 6
}
 

Functions

delegate Message MessageParser (IntPtr ptr)
 

Enumeration Type Documentation

◆ ChallengeVisibility

Describes who can see and join the challenge.

Enumerator
InviteOnly 

Everyone can see the challenge, but only those invited can join it.

Public 

Everyone can see and join the challenge.

Private 

Only those invited can see and join the challenge.

◆ LeaderboardStartAt

From where to start returning leaderboard entries.

Enumerator
Top 

To return entries from top 1.

CenteredOnViewer 

To place the current logged-in user's entry in the middle of the list on the first page. For example, if the total number of entries is 10, pageSize is set to 5, and the user's rank is top 5, the ranks displayed on the first page will be top 3, 4, 5, 6, and 7. Top 1 and 2 will not be displayed, and top 8, 9, and 10 will be displayed on the second page.

CenteredOnViewerOrTop 

To place the current logged-in user's entry on the top of the list on the first page. For example, if the total number of entries is 10, pageSize is set to 5, and the user's rank is top 5, the ranks displayed on the first page will be top 5, 6, 7, 8, and 9. Top 1, 2, 3, and 4 will not be displayed, and top 10 will be displayed on the second page.

Unknown 

To returns an empty list.

◆ AddonsType

enum AddonsType

The type of add-on

Enumerator
Durable 

The add-on is always available once a user buys it.

Consumable 

The add-on can be consumed by a user and the user can buy it again once the add-on is consumed.

Subscription 

Subscription add-on. Users need to regularly pay subscription fees.

◆ UserPresenceStatus

Whether the user is online or offline.

Enumerator
Unknown 

Unknown status.

OnLine 

The user is online.

OffLine 

The user is offline.

◆ CancelReason

The reason why the subscription is canceled. Pico.Platform.IAPService.GetSubscriptionStatus will return a subscription status structure. The cancel reason describes why the subscription is canceled.

Enumerator
UserCancelsExpiration 

The user canceled automatic renewal.

DeductionFailedExpired 

Deduction for automatic renewal failed.

NoMainApplicationInterest 

The user did not buy the app.

◆ SensitiveProposal

The strategy proposed to handle the text and the user that created the text. It's the result of Pico.Platform.ComplianceService.DetectSensitive.

Enumerator
Pass 

The text is legal.

OnlySelfVisible 

Only the user that created the text could see it.

UserMute 

Forbid the user from publishing texts for several days.

RejectSubmit 

Prevent the user from submitting the text.

◆ DetectSensitiveScene

Describes where the text appears in the app. Used for Pico.Platform.ComplianceService.DetectSensitive.

Enumerator
UserName 

The text is in a username.

RoomName 

The text is in a room name.

RoomChat 

The text is in a in-room-chat message.

◆ EntitlementStatus

The entitlement status of a subscription add-on. Used for Pico.Platform.IAPService.GetSubscriptionStatus.

Enumerator
Valid 

The user is entitled to use the subscription add-on.

Invalid 

The user is not entitled to use the subscription add-on.

Expired 

The subscription has expired.

Cancel 

The user has canceled the subscription. But the user has entitlement to the product now.

◆ LaunchType

enum LaunchType

How the app is launched. You can use it to determine how to parse Pico.Platform.Models.LaunchDetails. Please ref Pico.Platform.ApplicationService.GetLaunchDetails.

Enumerator
Normal 

The app is launched by clicking the app's icon.

RoomInvite 

The user clicks the room invitation message to launch the app.

Deeplink 

The user clicks the presence invitation message to launch the app.

ChallengeInvite 

The user clicks the challenge invitation message to launch the app.

◆ RtcMuteState

The state of a user's local audio.

Enumerator
Off 

Muted.

On 

On.

◆ RtcRoomProfileType

The type of the room.

Enumerator
Communication 

Communication room.

LiveBroadcasting 

Live broadcasting room.

Game 

Gaming room.

CloudGame 

Cloud gaming room.

LowLatency 

Low-latency room.

◆ RtcJoinRoomType

Whether it is the first time that the user has joined the room or if the user is reconnected to the room.

Enumerator
First 

It is the first time that the user has joined the room.

Reconnected 

The user is reconnected to the room.

◆ RtcMediaDeviceType

The type of media(?) device.

Enumerator
AudioUnknown 

Unknown audio device.

AudioRenderDevice 

Audio renderer.

AudioCaptureDevice 

Audio capture device.

◆ RtcMediaDeviceError

Types of media device errors.

Enumerator
Ok 

No error.

◆ GameRequestFailedReason

Various reasons for failed requests to platform game service.

Enumerator
NotInitialized 

Platform services are not initialized.

Uninitialized 

Platform services has been uninitialized.

◆ SportTarget

Users purpose of playing sports.

Enumerator
LoseFat 

To lose weight.

KeepFit 

To keep fit.

◆ UserRelationType

The relationship between two users.

You can call UserService.GetUserRelations to query user relation.

Enumerator
IsFriend 

The queried user is the current user's friend.

NotFriend 

The queried user is not the current user's friend and the current user can send a friend request to the queried user.

Blocked 

The queried user is blocked by the current user.

BlockedBy 

The current user is blocked by the queried user, so the current user cannot send a friend request to the queried user.

ApplyingFriend 

The current user has sent a friend request to the queried user.

◆ PlatformInitializeResult

The initialize result of Platform.

Enumerator
NetError 

The initialization need fetch application configuration. If the network request fails,you will get this error.

MissingImpl 

SDK depends on some system function. This error means failed to find implementation

LoadImplFailed 

Load implementation so failed.

InternalError 

Init failed with unclear reason.

InvalidParams 

The appid param is invalid. Please check the param.

AlreadyInitialized 

SDK has already been initialized.

Success 

SDK is initialized successfully.

◆ ShareMediaType

The type of media to share.

Enumerator
Video 

Videos attached with thumbnails.

Image 

Screenshots.

◆ ShareAppType

The app which the videos or screenshots are shared to.

Enumerator
Douyin 

The Douyin app.