> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qwacks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ربط الحسابات

> دع اللاعب الواحد يسجّل دخوله بعدّة بيانات اعتماد — الجهاز، أو البريد الإلكتروني، أو حساب اجتماعي.

export const Scope = ({children}) => <Info>
    <b>النطاق:</b> {children}
  </Info>;

اللاعب في Flock هو **حساب واحد يمكن أن يحمل عدّة بيانات اعتماد**. فقد يبدأ اللاعب نفسه بمعرّف
جهاز، ثم يضيف بريدًا إلكترونيًا وكلمة مرور لاحقًا، ثم يربط Google بعد ذلك — وتسجيل الدخول بأيٍّ
منها يصل إلى الحساب نفسه بالتقدّم نفسه.

وهذا ما يجعل البدء بالجهاز أولًا آمنًا: يبدأ اللاعب فورًا دون نموذج تسجيل، ثم يربط بيانات اعتماد
حقيقية حين يصبح مرتبطًا باللعبة، فيحتفظ بكل شيء إن فقد الجهاز.

<Scope>بيانات الاعتماد تخصّ **اللاعب**؛ واللاعب يخصّ لعبة.</Scope>

## أنواع بيانات الاعتماد

`device_id` و`email` و`google` و`apple` و`facebook` و`steam` و`discord`. ويمكن للاعب أن يحمل
واحدًا من كل نوع على الأكثر — فربط حساب Google ثانٍ باللاعب نفسه يُرفض بدل أن يحلّ محلّ الأول
بصمت.

<Tabs>
  <Tab title="Unity">
    يقع الربط في مزوّد المصادقة إلى جانب استدعاءات تسجيل الدخول، وكل دالة منه تتطلّب **لاعبًا
    مسجَّل الدخول**.

    ```csharp theme={null}
    // ما الذي يستطيع هذا اللاعب تسجيل الدخول به حاليًا؟
    List<PlayerLinkedAccount> accounts =
        await FlockClient.Instance.Authentication.GetLinkedAccountsAsync();

    // اربط بيانات اعتماد بريد إلكتروني/كلمة مرور باللاعب المسجَّل دخوله.
    accounts = await FlockClient.Instance.Authentication.LinkEmailAsync("player@example.com", "hunter2");

    // اربط حسابًا اجتماعيًا بالرمز نفسه الذي يحصل عليه مسار تسجيل الدخول لديك أصلًا.
    accounts = await FlockClient.Instance.Authentication.LinkGoogleAsync(idToken);

    // فُكّ الربط.
    accounts = await FlockClient.Instance.Authentication.UnlinkAsync(FlockCredentialProvider.Google);
    ```

    وهناك دالة لكل مزوّد — `LinkEmailAsync` و`LinkDeviceAsync` و`LinkGoogleAsync`
    و`LinkAppleAsync` و`LinkFacebookAsync` و`LinkSteamAsync` و`LinkDiscordAsync` — وكل منها يأخذ
    الرمز نفسه الذي يحصل عليه مسار تسجيل الدخول من تلك المنصّة. أما `UnlinkAsync` فتأخذ
    `FlockCredentialProvider` بدلًا من ذلك.

    و**كل واحدة من هذه الدوال تُعيد قائمة بيانات الاعتماد كاملةً بعد التحديث**، فيؤدّي الربط
    وفكّه دور التحديث أيضًا — ونادرًا ما تحتاج إلى استدعاء `GetLinkedAccountsAsync` مرة أخرى
    مباشرةً بعدها.

    ويحمل كل `PlayerLinkedAccount` الحقول `Provider` و`ProviderUserId` و`Email` و`EmailVerified`.

    <Warning>
      **لا يستطيع اللاعب فكّ ربط آخر بيانات اعتماد لديه.** فإزالتها تترك حسابًا لا يستطيع أحد
      تسجيل الدخول إليه، ولذلك يرفض الخادم ذلك بالرمز
      `FlockErrorCode.PlayerCannotUnlinkLastCredential`. عطِّل زر فكّ الربط حين تحتوي القائمة على
      مدخل واحد بدل أن يكتشف اللاعب ذلك على هيئة خطأ.
    </Warning>

    **أخطاء يستحقّ التعامل معها بالاسم:**

    | الرمز                              | المعنى                                                   |
    | ---------------------------------- | -------------------------------------------------------- |
    | `PlayerAccountAlreadyLinked`       | بيانات الاعتماد مرتبطة سلفًا — بهذا اللاعب أو بلاعب آخر. |
    | `PlayerAccountNotLinked`           | فكّ ربط شيء لا يملكه اللاعب.                             |
    | `PlayerCannotUnlinkLastCredential` | آخر وسيلة تسجيل دخول متبقّية.                            |
    | `PlayerInvalidLinkRequest`         | رفض المزوّد الرمز المُرسَل.                              |

    <Note>
      **لا يوجد مسار لدمج الحسابات.** فإن كانت بيانات الاعتماد تخصّ لاعبًا *آخر*، يفشل الربط
      بالرمز `PlayerAccountAlreadyLinked` — ولن تدمج Flock تقدّم لاعبَين معًا، إذ لا توجد إجابة
      عامة آمنة عن أيّ الحفظَين يفوز. قرّر داخل لعبتك ما الذي تعرضه: الإبقاء على الحساب الحالي،
      أو تسجيل الخروج والدخول إلى الآخر.
    </Note>

    ولا تُخزَّن حالة بيانات الاعتماد مؤقتًا ولا تُصفّ في طابور عند انقطاع الاتصال — فهي حالة
    أمنية، والإجابة القديمة فيها أسوأ من عدم الإجابة. وكل استدعاء يذهب إلى الخادم.
  </Tab>
</Tabs>

## إعادة تعيين كلمة المرور ببريد مرتبط

تعمل `ResetPasswordAsync` مع اللاعب الذي سجّل دخوله **ببريد إلكتروني**، وكذلك مع من ربط بريدًا
إلكترونيًا خلال الجلسة الحالية.

وتعرف حزمة التطوير ما هو مرتبط من قائمة بيانات الاعتماد، وهي لا تحفظ ذلك عمدًا بين عمليات
التشغيل. لذا بعد استعادة جلسة، استدعِ `GetLinkedAccountsAsync()` مرة واحدة قبل عرض إعادة تعيين
كلمة المرور — وإلا فلن تعلم حزمة التطوير بعدُ أن لدى اللاعب بريدًا يمكن إعادة تعيينه.

<Note>
  ربط الحسابات متاح في [حزمة Unity](/ar/sdk/unity). أما دعم Unreal فغير متاح بعد.
</Note>

راجع [اللاعبون والمصادقة](/ar/authentication) للاطّلاع على استدعاءات تسجيل الدخول نفسها.
