তৃতীয় পক্ষের সম্মেলন তৈরি করা

আপনার স্ক্রিপ্ট প্রজেক্ট ম্যানিফেস্টে আপনি সংজ্ঞায়িত প্রতিটি কনফারেন্স সমাধানের একটি যুক্ত onCreateFunction আছে। অ্যাড-অন এই ফাংশনটিকে একটি কনফারেন্স তৈরি করতে কল করে যখনই একজন ব্যবহারকারী সেই কনফারেন্স সমাধান একটি ইভেন্ট নির্বাচন করার চেষ্টা করেন।

আপনার অ্যাড-অন ম্যানিফেস্টে বর্ণিত প্রতিটি onCreateFunction আপনাকে অবশ্যই বাস্তবায়ন করতে হবে। সাধারণভাবে, এই ফাংশনগুলি অবশ্যই নিম্নলিখিতগুলি করতে হবে:

  1. কোনো Google ক্যালেন্ডার ইভেন্ট তথ্য পুনরুদ্ধার করুন, যেমন ইভেন্ট আইডি বা অংশগ্রহণকারীদের তালিকা, যা সম্মেলন তৈরি করার জন্য তৃতীয় পক্ষের কনফারেন্সিং সিস্টেমের প্রয়োজন হতে পারে।
  2. তৃতীয় পক্ষের কনফারেন্সিং পরিষেবার সাথে সংযোগ করুন এবং সেখানে Google ক্যালেন্ডার ইভেন্ট তথ্য ব্যবহার করে একটি নতুন সম্মেলন তৈরি করুন৷
  3. যদি কোনো কারণে কনফারেন্স তৈরির অনুরোধ ব্যর্থ হয়, তাহলে ConferenceError ধারণকারী ConferenceData অবজেক্ট তৈরি করতে এবং ফেরত দিতে ত্রুটির তথ্য ব্যবহার করুন। অন্যথায়, পরবর্তী পদক্ষেপগুলি সম্পূর্ণ করুন৷
    1. কনফারেন্স সিঙ্কিং শুরু করুন।
    2. একটি নতুন ConferenceData অবজেক্ট তৈরি করতে এবং ফেরত দিতে তৃতীয় পক্ষের কনফারেন্সিং পরিষেবা দ্বারা ফেরত দেওয়া তথ্য ব্যবহার করুন।

ইভেন্ট তথ্য পুনরুদ্ধার করা হচ্ছে

একটি তৃতীয় পক্ষের সম্মেলন তৈরি করতে সংশ্লিষ্ট Google ক্যালেন্ডার ইভেন্ট সম্পর্কে কিছু তথ্য প্রয়োজন৷ বিভিন্ন থার্ড-পার্টি কনফারেন্স সিস্টেমের মধ্যে প্রয়োজনীয় সঠিক ইভেন্টের তথ্য পরিবর্তিত হয়, কিন্তু প্রায়শই এতে ইভেন্ট শুরুর সময়, শেষের সময়, সারাংশ, অংশগ্রহণকারীদের তালিকা এবং আইডি অন্তর্ভুক্ত থাকে।

কল করা হলে, আপনার সংজ্ঞায়িত প্রতিটি onCreateFunction একটি আর্গুমেন্ট পাস করা হয় যাতে ক্যালেন্ডার এবং ইভেন্ট আইডি থাকে। আপনি Google ক্যালেন্ডার উন্নত পরিষেবা ব্যবহার করে সম্পূর্ণ ইভেন্ট তথ্য পুনরুদ্ধার করতে এই আইডিগুলি ব্যবহার করতে পারেন৷

Google ক্যালেন্ডারের পক্ষে এটি উপস্থিত হওয়ার আগে একটি ইভেন্টে সম্মেলনের বিবরণ যোগ করা সম্ভব। এই ধরনের ক্ষেত্রে, Google ক্যালেন্ডার onCreateFunction একটি বৈধ eventId পাস করে, কিন্তু Calendar.Events.get() -এ পরবর্তী কলের ফলে ইভেন্টটি বিদ্যমান নেই বলে একটি ত্রুটি প্রতিক্রিয়া দেখা দিতে পারে। এই ক্ষেত্রে, স্থানধারক ডেটা ব্যবহার করে তৃতীয় পক্ষের সম্মেলন তৈরি করা ভাল; পরবর্তী সময়ে ইভেন্ট সিঙ্ক হলে এই ডেটা প্রতিস্থাপিত হয়।

তৃতীয় পক্ষের সম্মেলন তৈরি করা হচ্ছে

একবার onCreateFunction প্রয়োজনীয় ইভেন্ট ডেটা পুনরুদ্ধার করলে, কনফারেন্স তৈরি করতে এটিকে তৃতীয় পক্ষের কনফারেন্সিং সিস্টেমের সাথে সংযোগ করতে হবে। সাধারণত তৃতীয় পক্ষের কনফারেন্সিং সিস্টেম দ্বারা সমর্থিত API অনুরোধ করে এটি সম্পন্ন করা হয়। কনফারেন্স তৈরি করতে আপনি কোন API অনুরোধগুলি ব্যবহার করতে পারেন তা নির্ধারণ করতে আপনার তৃতীয় পক্ষের কনফারেন্সিং সমাধানের জন্য ডকুমেন্টেশন পরীক্ষা করুন৷

Apps Script-এ, বহিরাগত API অনুরোধগুলি পরিচালনা করার সবচেয়ে সহজ উপায় হল Apps স্ক্রিপ্টের জন্য OAuth2 বা Apps স্ক্রিপ্ট ওপেন-সোর্স লাইব্রেরির জন্য OAuth1 ব্যবহার করা। এছাড়াও আপনি UrlFetch পরিষেবা ব্যবহার করে বহিরাগত API-এর সাথে সংযোগ করতে পারেন, কিন্তু এর জন্য আপনাকে স্পষ্টভাবে অনুমোদনের বিবরণ পরিচালনা করতে হবে।

কনফারেন্স তৈরির অনুরোধ করার পরে, নতুন কনফারেন্সের বিশদ পুনরুদ্ধার করার জন্য আপনাকে অতিরিক্ত অনুরোধ করতে হতে পারে।

কনফারেন্স সিঙ্কিং শুরু করুন

একবার অ্যাড-অন সফলভাবে একটি তৃতীয় পক্ষের সিস্টেমে একটি সম্মেলন তৈরি করলে, এটিকে সিঙ্কিং সক্ষম করার জন্য কয়েকটি পদক্ষেপ নেওয়া উচিত যাতে Google ক্যালেন্ডার ইভেন্টে পরিবর্তনগুলি সম্মেলনে প্রতিফলিত হয়৷

কনফারেন্স তৈরির পরে সিঙ্কিং সেট আপ করার বিষয়ে বিশদ বিবরণের জন্য সিঙ্কিং ক্যালেন্ডার পরিবর্তনগুলি দেখুন৷

একটি সম্মেলন তথ্য প্রতিক্রিয়া নির্মাণ

তৃতীয় পক্ষের পরিষেবা দ্বারা প্রত্যাবর্তিত কনফারেন্স তথ্য ব্যবহার করে, onCreateFunction অবশ্যই একটি ConferenceData অবজেক্ট তৈরি এবং ফেরত দিতে হবে; কনফারেন্স ডেটা বিভাগ এই বস্তুর বিষয়বস্তু বর্ণনা করে। Google ক্যালেন্ডার এটি ব্যবহার করে এই তথ্যটি ব্যবহার করে ব্যবহারকারীদেরকে কনফারেন্সে পাঠানোর জন্য এটি শুরু হলে।

ConferenceData অবজেক্ট তৈরি করার সময়, সচেতন থাকুন যে ক্ষেত্রের দৈর্ঘ্য, এন্ট্রি পয়েন্ট ইউআরআই-এর ফর্ম্যাট এবং এন্ট্রি পয়েন্টগুলির অনুমোদিত সংমিশ্রণের কিছু সীমাবদ্ধতা রয়েছে। উদাহরণস্বরূপ, একটি ConferenceData সর্বাধিক একটি VIDEO এন্ট্রি পয়েন্ট থাকতে পারে৷ এই সীমাবদ্ধতাগুলি সংশ্লিষ্ট conferenceData ক্ষেত্রের জন্য ক্যালেন্ডার API ইভেন্টে বর্ণিত সীমাবদ্ধতার সাথে অভিন্ন, যদিও সেখানে বর্ণিত সমস্ত API ইভেন্ট ক্ষেত্র Apps স্ক্রিপ্টে উপলব্ধ নয়৷

হ্যান্ডলিং ত্রুটি

কিছু ক্ষেত্রে তৃতীয় পক্ষের কনফারেন্সিং সিস্টেম দ্বারা প্রত্যাবর্তিত ত্রুটির কারণে কনফারেন্স তৈরি সম্পূর্ণ করা যাবে না। এই ক্ষেত্রে আপনার অ্যাড-অনকে ConferenceError বিবরণ সম্বলিত ConferenceData অবজেক্ট তৈরি এবং ফেরত দিয়ে ত্রুটির অবস্থা দৃঢ়ভাবে পরিচালনা করা উচিত, যাতে Google ক্যালেন্ডার সেই অনুযায়ী কাজ করতে পারে।

একটি ত্রুটি রিপোর্ট করার জন্য একটি ConferenceData অবজেক্ট তৈরি করার সময়, আপনাকে ConferenceError অবজেক্ট ছাড়া অন্য কোন ConferenceData উপাদান অন্তর্ভুক্ত করতে হবে না। 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;
}