ایجاد کنفرانس های شخص ثالث

هر راهکار کنفرانسی که در اسکریپت مانیفست پروژه خود تعریف کرده‌اید، یک onCreateFunction مرتبط دارد. افزونه این تابع را برای ایجاد یک کنفرانس فراخوانی می‌کند، هر زمان که کاربر سعی کند آن راهکار کنفرانس را به عنوان یک رویداد انتخاب کند.

شما باید هر onCreateFunction که در فایل manifest افزونه‌تان توضیح داده شده است را پیاده‌سازی کنید. به طور کلی، این توابع باید موارد زیر را انجام دهند:

  1. هرگونه اطلاعات رویداد تقویم گوگل، مانند شناسه رویداد یا فهرست شرکت‌کنندگان، را که سیستم کنفرانس شخص ثالث ممکن است برای ایجاد کنفرانس به آن نیاز داشته باشد، بازیابی کنید.
  2. به سرویس کنفرانس شخص ثالث متصل شوید و با استفاده از اطلاعات رویداد تقویم گوگل، یک کنفرانس جدید در آنجا ایجاد کنید.
  3. اگر درخواست ایجاد کنفرانس به هر دلیلی با شکست مواجه شد، از اطلاعات خطا برای ساخت و بازگرداندن یک شیء ConferenceData حاوی یک ConferenceError استفاده کنید. در غیر این صورت، مراحل بعدی را انجام دهید.
    1. همگام‌سازی کنفرانس را آغاز کنید.
    2. از اطلاعات برگردانده شده توسط سرویس کنفرانس شخص ثالث برای ساخت و برگرداندن یک شیء جدید ConferenceData استفاده کنید.

بازیابی اطلاعات رویداد

برای ایجاد یک کنفرانس شخص ثالث، اطلاعات خاصی در مورد رویداد تقویم گوگل مربوطه مورد نیاز است. اطلاعات دقیق رویداد مورد نیاز بین سیستم‌های کنفرانس شخص ثالث مختلف متفاوت است، اما اغلب این اطلاعات شامل زمان شروع رویداد، زمان پایان، خلاصه، لیست شرکت‌کنندگان و شناسه است.

هنگام فراخوانی، به هر onCreateFunction که تعریف می‌کنید، یک آرگومان ارسال می‌شود که شامل شناسه‌های تقویم و رویداد است. می‌توانید از این شناسه‌ها برای بازیابی اطلاعات کامل رویداد با استفاده از سرویس پیشرفته تقویم گوگل استفاده کنید.

تقویم گوگل می‌تواند جزئیات کنفرانس را قبل از وجود یک رویداد به آن اضافه کند. در چنین مواردی، تقویم گوگل به تابع onCreateFunction یک eventId معتبر ارسال می‌کند، اما فراخوانی‌های بعدی به Calendar.Events.get() می‌تواند منجر به پاسخ خطایی شود که می‌گوید رویداد وجود ندارد. در این موارد، بهتر است کنفرانس شخص ثالث را با استفاده از داده‌های placeholder ایجاد کنید؛ این داده‌ها دفعه بعد که رویداد همگام‌سازی می‌شود، جایگزین می‌شوند.

ایجاد کنفرانس شخص ثالث

پس از اینکه onCreateFunction داده‌های رویداد لازم را بازیابی کرد، باید برای ایجاد کنفرانس به سیستم کنفرانس شخص ثالث متصل شود. معمولاً این کار با ارسال درخواست‌های API پشتیبانی‌شده توسط سیستم کنفرانس شخص ثالث انجام می‌شود. مستندات مربوط به راهکار کنفرانس شخص ثالث خود را بررسی کنید تا مشخص شود از چه درخواست‌های API می‌توانید برای ایجاد کنفرانس‌ها استفاده کنید.

در Apps Script، ساده‌ترین راه برای مدیریت درخواست‌های API خارجی، استفاده از کتابخانه‌های متن‌باز OAuth2 برای Apps Script یا OAuth1 برای Apps Script است. همچنین می‌توانید با استفاده از سرویس UrlFetch به APIهای خارجی متصل شوید ، اما این امر مستلزم آن است که جزئیات مجوز را به صراحت مدیریت کنید.

پس از درخواست ایجاد کنفرانس، ممکن است لازم باشد درخواست‌های دیگری برای بازیابی جزئیات کنفرانس جدید ارسال کنید.

همگام‌سازی کنفرانس را آغاز کنید

پس از اینکه افزونه با موفقیت کنفرانسی را در یک سیستم شخص ثالث ایجاد کرد، باید چند مرحله را برای فعال کردن همگام‌سازی انجام دهد تا تغییرات رویداد تقویم گوگل در کنفرانس منعکس شود.

برای جزئیات بیشتر در مورد تنظیمات همگام‌سازی پس از ایجاد کنفرانس، به بخش همگام‌سازی تغییرات تقویم مراجعه کنید.

ساخت یک پاسخ داده کنفرانسی

با استفاده از اطلاعات کنفرانس که توسط سرویس شخص ثالث برگردانده می‌شود، تابع onCreateFunction باید یک شیء ConferenceData بسازد و برگرداند؛ بخش داده‌های کنفرانس، محتوای این شیء را توصیف می‌کند. تقویم گوگل از این اطلاعات برای هدایت کاربران به کنفرانس پس از شروع آن استفاده می‌کند.

هنگام ساخت یک شیء ConferenceData ، توجه داشته باشید که محدودیت‌هایی در طول فیلدها، قالب‌های URIهای نقطه ورودی و ترکیب‌های مجاز نقاط ورودی وجود دارد. برای مثال، حداکثر یک نقطه ورودی VIDEO می‌تواند در یک ConferenceData واحد وجود داشته باشد. این محدودیت‌ها با محدودیت‌های شرح داده شده در Calendar API Event](/workspace/calendar/v3/reference/events) برای فیلد conferenceData مربوطه یکسان هستند، اگرچه همه فیلدهای رویداد API شرح داده شده در Apps Script در دسترس نیستند.

مدیریت خطاها

در برخی موارد، ایجاد کنفرانس به دلیل خطایی که توسط سیستم کنفرانس شخص ثالث برگردانده می‌شود، نمی‌تواند تکمیل شود. در این موارد، افزونه شما باید با ساخت و بازگرداندن یک شیء ConferenceData حاوی جزئیات ConferenceError ، به طور قوی شرایط خطا را مدیریت کند تا تقویم گوگل بتواند بر اساس آن عمل کند.

هنگام ساخت یک شیء ConferenceData برای گزارش خطا، نیازی به گنجاندن هیچ مؤلفه ConferenceData جدا از شیء ConferenceError ندارید. ConferenceErrors می‌توانند یک ConferenceErrorType ، یک پیام خطا، و در صورت احراز هویت، یک URL داشته باشند که به کاربران اجازه می‌دهد وارد سیستم کنفرانس شخص ثالث شوند.

مثال

مثال زیر یک تابع onCreateFunction را نشان می‌دهد (توجه داشته باشید که نام تابع می‌تواند هر چیزی باشد؛ شما فقط باید آن را در فایل مانیفست پروژه افزونه خود تعریف کنید).

تابع create3rdPartyConference() با سیستم شخص ثالث تماس می‌گیرد تا کنفرانس را در آنجا ایجاد کند و تابع getAuthenticationUrl() یک URL احراز هویت سیستم شخص ثالث ایجاد می‌کند. این موارد در اینجا به طور کامل پیاده‌سازی نشده‌اند، زیرا به شدت به جزئیات سیستم شخص ثالث وابسته هستند.

تابع initializeSyncing() در اینجا نشان داده نشده است؛ این تابع هرگونه کار اولیه مورد نیاز برای همگام‌سازی را انجام می‌دهد. برای جزئیات بیشتر به بخش تغییرات تقویم همگام‌سازی مراجعه کنید.

/**
 *  Creates a conference, then builds and returns a ConferenceData object
 *  with the corresponding conference information. This method is called
 *  when a user selects a conference solution defined by the add-on that
 *  uses this function as its 'onCreateFunction' in the add-on manifest.
 *
 *  @param {Object} arg The default argument passed to a 'onCreateFunction';
 *      it carries information about the Google Calendar event.
 *  @return {ConferenceData}
 */
function createConference(arg) {
  const eventData = arg.eventData;
  const calendarId = eventData.calendarId;
  const eventId = eventData.eventId;

  // Retrieve the Calendar event information using the Calendar
  // Advanced service.
  var calendarEvent;
  try {
    calendarEvent = Calendar.Events.get(calendarId, eventId);
  } catch (err) {
    // The calendar event does not exist just yet; just proceed with the
    // given event ID and allow the event details to sync later.
    console.log(err);
    calendarEvent = {
      id: eventId,
    };
  }

  // Create a conference on the third-party service and return the
  // conference data or errors in a custom JSON object.
  var conferenceInfo = create3rdPartyConference(calendarEvent);

  // Build and return a ConferenceData object, either with conference or
  // error information.
  var dataBuilder = ConferenceDataService.newConferenceDataBuilder();

  if (!conferenceInfo.error) {
    // No error, so build the ConferenceData object from the
    // returned conference info.

    var phoneEntryPoint = ConferenceDataService.newEntryPoint()
        .setEntryPointType(ConferenceDataService.EntryPointType.PHONE)
        .setUri('tel:+' + conferenceInfo.phoneNumber)
        .setPin(conferenceInfo.phonePin);

    var adminEmailParameter = ConferenceDataService.newConferenceParameter()
        .setKey('adminEmail')
        .setValue(conferenceInfo.adminEmail);

    dataBuilder.setConferenceId(conferenceInfo.id)
        .addEntryPoint(phoneEntryPoint)
        .addConferenceParameter(adminEmailParameter)
        .setNotes(conferenceInfo.conferenceLegalNotice);

    if (conferenceInfo.videoUri) {
      var videoEntryPoint = ConferenceDataService.newEntryPoint()
          .setEntryPointType(ConferenceDataService.EntryPointType.VIDEO)
          .setUri(conferenceInfo.videoUri)
          .setPasscode(conferenceInfo.videoPasscode);
      dataBuilder.addEntryPoint(videoEntryPoint);
    }

    // Since the conference creation request succeeded, make sure that
    // syncing has been enabled.
    initializeSyncing(calendarId, eventId, conferenceInfo.id);

  } else if (conferenceInfo.error === 'AUTH') {
    // Authenentication error. Implement a function to build the correct
    // authenication URL for the third-party conferencing system.
    var authenticationUrl = getAuthenticationUrl();
    var error = ConferenceDataService.newConferenceError()
        .setConferenceErrorType(
            ConferenceDataService.ConferenceErrorType.AUTHENTICATION)
        .setAuthenticationUrl(authenticationUrl);
    dataBuilder.setError(error);

  } else {
    // Other error type;
    var error = ConferenceDataService.newConferenceError()
        .setConferenceErrorType(
            ConferenceDataService.ConferenceErrorType.TEMPORARY);
    dataBuilder.setError(error);
  }

  // Don't forget to build the ConferenceData object.
  return dataBuilder.build();
}


/**
 *  Contact the third-party conferencing system to create a conference there,
 *  using the provided calendar event information. Collects and retuns the
 *  conference data returned by the third-party system in a custom JSON object
 *  with the following fields:
 *
 *    data.adminEmail - the conference administrator's email
 *    data.conferenceLegalNotice - the conference legal notice text
 *    data.error - Only present if there was an error during
 *         conference creation. Equal to 'AUTH' if the add-on user needs to
 *         authorize on the third-party system.
 *    data.id - the conference ID
 *    data.phoneNumber - the conference phone entry point phone number
 *    data.phonePin - the conference phone entry point PIN
 *    data.videoPasscode - the conference video entry point passcode
 *    data.videoUri - the conference video entry point URI
 *
 *  The above fields are specific to this example; which conference information
 *  your add-on needs is dependent on the third-party conferencing system
 *  requirements.
 *
 * @param {Object} calendarEvent A Calendar Event resource object returned by
 *     the Google Calendar API.
 * @return {Object}
 */
function create3rdPartyConference(calendarEvent) {
  var data = {};

  // Implementation details dependent on the third-party system API.
  // Typically one or more API calls are made to create the conference and
  // acquire its relevant data, which is then put in to the returned JSON
  // object.

  return data;
}

/**
 *  Return the URL used to authenticate the user with the third-party
 *  conferencing system.
 *
 *  @return {String}
 */
function getAuthenticationUrl() {
  var url;
  // Implementation details dependent on the third-party system.

  return url;
}