نسخهٔ 0٫4٫0
تاریخ انتشار: 1 شهریور 1405
بزرگترین انتشار یاس تا امروز؛ هشت مجموعه تغییر که سه سرویس تازه به سامانه میافزاید و چند مسیر قدیمی را از پایه بازنویسی میکند.
---
پیامک: الگوهای تأییدشده و خلاصهٔ گفتگو
هر پیامک، یک «الگو»ی ثبتشده
خط خدماتی در ایران تنها متنهایی را حمل میکند که پیشتر در پنل اپراتور ثبت و تأیید شده باشند؛ هر متن دیگری یا رد میشود یا روی خط تبلیغاتی مینشیند — خطی که فیلتر میشود، شب اجازهٔ ارسال ندارد و آخرین چیزی است که یک پیامک از آموزشگاه باید شبیه آن باشد.
این قاعده تا پیش از این تنها دربارهٔ رمز یکبارمصرف رعایت میشد و بهاشتباه ویژگی خودِ رمز پنداشته شده بود. از این نسخه، تمام یازده متنی که سامانه ارسال میکند الگوی ثبتشدهاند. نام پارامترها پیش از تماس با درگاه اعتبارسنجی میشود، بنابراین یک جایگذاری نادرست در همین فرایند خطا میدهد و دیگر با حفرهای خالی روی گوشی کسی نمینشیند.
پنج پیام، یک پیامک
مدرّسی که پنج سطر در گفتگوی کلاس مینویسد، تا دیروز پنج پیامک جداگانه به تمام گوشیهای آن کلاس میفرستاد: آموزشگاه پنج بار هزینه میداد و چهارصد نفر پنج بار برای خواندن یک حرف در پنج تکه منقطع میشدند.
اکنون پیامهای یک فرستنده در یک اتاق در قالب یک بلوک گرد هم میآیند و سه دقیقه پس از سکوت فرستنده، یکجا سنجیده میشوند. آنچه ارسال میشود یک پیامک است: خلاصهای در چهل نویسه، بههمراه پیوندی به متن کامل در نشانی yasapp.ir/m/<کد>.
تصمیمِ «آیا این پیام ارزش پیامک دارد؟»
هیچ فرادادهای «سلام بچهها» را از «کلاس فردا برگزار نمیشود» جدا نمیکند؛ فرستنده یکی است، ساعت یکی است و طول متن چیزی نمیگوید. آنچه این دو را از هم جدا میکند معنای جملههاست، و این تنها کاری است که یک مدل زبانی هم ارزان و هم خوب انجام میدهد.
هنگامی که مدل پاسخ ندهد، پیشفرض «عادی» است — و این انتخاب عمدی است. دو گونه خطا در اینجا هموزن نیستند: حدسِ «مهم» پول آموزشگاه را خرج میکند و چهارصد گوشی را برای «سلام بچهها» به صدا درمیآورد، آن هم دقیقاً هر بار که درگاه از دسترس خارج است، یعنی همان زمانی که کسی حواسش نیست. حدسِ «عادی» اما چیزی را از دست نمیدهد: زنگ اعلان و بنر Push مانند همیشه و بهازای هر پیام ارسال میشوند. بلوک، کانال سوم است، نه تنها کانال.
هزینهٔ این تصمیم بر عهدهٔ اپراتور سکوست و هیچ ردیفی در صورتحساب آموزشگاه ندارد: این پردازش بهنمایندگی از آموزشگاه تصمیم میگیرد که آیا اعتبار پیامکش خرج شود یا نه، و گرفتن هزینهٔ تصمیم در کنار هزینهٔ خودِ پیامک، سطری است که در هیچ صورتحسابی قابل دفاع نیست.
---
گفتگوی کلاس، حالا بخشی از پیامرسان است
کلاس زنده تا پیش از این گفتگوی مخصوص خود را داشت: کانال دادهٔ LiveKit، حبابهای پیام مخصوص خود، جعبهٔ نوشتن مخصوص خود — و هیچچیز ماندگار. سه ایراد داشت که در حقیقت یک ایراد بودند: پیادهسازی دومی از چیزی که سامانه پیشتر داشت.
- کسی که بیست دقیقه دیر میرسید، پنجرهای خالی میدید.
- عکس فرستاده نمیشد.
- با پایان کلاس، گفتگو از میان میرفت.
از این نسخه، هر جلسه اتاق گفتگوی واقعی خود را دارد: با بالا آمدن کلاس ساخته و با پایان آن بایگانی میشود. پنجرهٔ «گفتگو» در کلاس، همان گفتگویی است که در «اطلاعرسانی» باز میشود — همزمان در هر دو جا، با تمام تاریخچه، و هفتهٔ بعد هم سرِ جایش.
رفع یک اشکال پنهان در سوکتها
لایهٔ کانال نادرست انتخاب شده بود. RedisChannelLayer تحویل پیام را با نظرسنجی دورهای انجام میدهد و در نسخههای جدید کتابخانهٔ redis، هر پنج ثانیه استثنایی پرتاب میشد که مصرفکننده را از پا درمیآورد. نتیجه این بود که تمام سوکتهای گفتگوی سامانه، تمام روز، تقریباً هر ده ثانیه یکبار قطع و دوباره وصل میشدند — بیآنکه چیزی روی صفحه آن را نشان دهد.
پیامها همچنان میرسیدند (کارخواه با مکاننما خود را بهروز میکرد)، اما ترافیک زودگذر از دست میرفت: نشانگر «در حال نوشتن»، حضور، و رسید خواندن. به همین دلیل این اشکال سالها بهشکل «نشانگر تایپ کار نمیکند» دیده میشد و هرگز بهشکل یک مشکل سوکت.
---
«دعوت گروهی»
دعوت یک کلاس، شماره به شماره، کاری است که کسی انجام نمیدهد؛ به همین دلیل فهرستها روی کاغذ میماندند. اکنون همان فایل اکسلی که آموزشگاه از پیش نگه میدارد، به دعوتنامه تبدیل میشود.
فایل هرگز از مرورگر خارج نمیشود
از یک فهرست عضویت تنها یک ستون شمارهٔ تلفن لازم است. باقی فایل — نامها، کد ملی، شمارهٔ والدین، یادداشتهای شهریه — فهرست خصوصی یک نفر است، و فرستادن تمام آن به سرور تا سرور همه را جز یک ستون دور بریزد، یعنی این سکو آن فهرست را ذخیره میکند، پشتیبان میگیرد و باید پاسخگوی آن باشد.
بنابراین فایل xlsx یا csv در همین مرورگر خوانده میشود، کاربر جدولِ استخراجشده را میبیند و ستون را خودش انتخاب میکند، و تنها شمارههایی که تأیید کرده ارسال میشوند.
پشتیبانی از کدگذاری نیز در نظر گرفته شده است: اکسلِ ویندوز فارسی فایل CSV را با windows-1256 مینویسد و همان فایل اگر UTF-8 خوانده شود، نامها را ناخوانا و شمارهها را سالم تحویل میدهد — خطایی که در نگاه اول شبیه مشکل قلم بهنظر میرسد.
کاری که با بستن مرورگر از بین نمیرود
چهارصد دعوتنامه یعنی چهارصد تراکنش اعتباری و چهارصد رفتوبرگشت با درگاه پیامک. انجام این کار درون همان درخواستی که آن را آغاز کرده، یعنی مرورگر منتظر میماند، پراکسی منصرف میشود و — که مهمتر است — هیچکس نمیداند کار تا کجا پیش رفته.
اکنون درخواست فهرست را ثبت میکند و بازمیگردد؛ یک کارگر آن را قطرهقطره پیش میبرد و هر گیرنده را بهمحض انجام علامت میزند؛ و صفحه شمارنده را دنبال میکند. بستن زبانه چیزی را از بین نمیبرد. اگر ظرف اجرا از کار بیفتد، کاری زمانبندیشده کار نیمهمانده را برمیدارد و از روی همان فهرست ادامه میدهد، نه از ابتدا — بنابراین هیچ شمارهای دو بار دعوت نمیشود.
---
«سندها» و صفحهٔ عمومی «نسخهها»
فهرست تغییراتی که درون بستهٔ برنامه ساخته شده باشد، هرگز نمیتواند انتشاری را توصیف کند که خودش با آن منتشر شده است.
بنابراین «نسخهها» داده است، نه فایل: اپراتور در کنسول مدیریت متن Markdown مینویسد، دکمهٔ انتشار را میزند، و نشانی yasapp.ir/releases همان لحظه آن را نشان میدهد — بدون ساخت، بدون تگ، بدون استقرار.
یک جدول برای همهچیز، چون یادداشت انتشار، دستورالعمل داخلی و پیشنویس صفحهٔ «دربارهٔ ما» یک چیزند: عنوان، متن Markdown، و اینکه آیا عموم اجازهٔ دیدنش را دارند. آنچه آنها را از هم جدا میکند برچسب است. امروز تنها برچسب version نقشآفرین است و صفحهٔ عمومی بر همان صافی میگذارد؛ بنابراین یادداشتهای شخصی اپراتور در همان ویرایشگر میمانند و هرگز به صفحهٔ عمومی راه نمییابند.
متن دقیقاً همانگونه که نوشته شده ذخیره میشود و هیچ HTMLای در سرور تولید نمیگردد؛ صفحهٔ عمومی آن را بهصورت گرههای React نمایش میدهد. بنابراین پرسش «اگر اپراتور یک <script> بچسباند چه؟» اصلاً پاسخی برای اشتباهشدن ندارد — برچسب در متن، متن است و متن هم بیرون میآید.
---
کنسول مدیریت روی گوشی
تمام صفحههای کنسول اپراتور دسکتاپ را فرض میگرفتند: ریلی ثابت در کنار صفحه، جدولی که باریک نمیشد، و بدنهای که زیر 768 پیکسل بهپهنا میلغزید. کنسول اما جایی است که سکو در ساعات غیراداری از آن مراقبت میشود — یعنی دقیقاً همان وقتی که تنها صفحهٔ در دسترس، گوشی است.
منو اکنون یک بار نوشته و دو بار نمایش داده میشود: ریل در دسکتاپ و کشوی همبرگری در گوشی. نقطهٔ شکست در هر دو جهت در CSS تعریف شده است، نه با اندازهگیری پهنا در جاوااسکریپت — روشی که در نخستین ترسیم، برای یک فریم، نسخهٔ نادرست را نشان میدهد.
---
فرمهای عمومی ثبتنام
کسی که کد QR چسباندهشده روی تابلوی اعلانات را میخواند، تا دیروز مستقیم روی صفحهٔ ورود سکویی مینشست که نامش را نشنیده بود، آن هم متصل به آموزشگاهی که صفحه نامش را نمیبرد. رایجترین پاسخ به این وضعیت، بستن زبانه است.
اکنون پیش از هر چیز یک صفحه به او پاسخ میدهد: نام و نوع آموزشگاه، تصاویر چند دورهٔ آن، و سه عدد کلیدی. تنها دورههای قابلعرضه نمایش داده میشوند — کلاس بایگانیشده یا داخلی چیزی برای تبلیغ نیست.
در صفحهٔ مدیریت فرمها نیز نشانی چاپشده حذف شد. کلیدی مبهم و شصتنویسهای در یک قاب، نه خوانده میشود، نه به خاطر میماند و نه کسی آن را تایپ میکند؛ همه فقط رونوشت میگیرند. پیوند اکنون درون کد QR است و خودِ قاب یک دکمهٔ بزرگ رونوشتگیری است.
---
ظاهر و تجربهٔ کاربری
- ردیف عملیات دیگر پایین صفحه گم نمیشود. دکمهٔ «ذخیره» تنها چیزی است که کاربر برای آن به صفحه آمده، و در صفحهای بلندتر از نمایشگر هرجا که آخرین پرسش تمام میشد مینشست — در صفحهٔ ساخت نقش، یک صفحهونیم پایینتر از دید، بیآنکه چیزی از وجودش خبر دهد. اکنون نواری ثابت در پای صفحه است. ترتیب درون آن قطعی است: راه خروج نخست، عملِ نهایی آخر.
- بریدگی بالای نمایشگر و نوار خانهٔ گوشی، دقیقاً یک بار محاسبه میشوند. پیش از این در کلاس زنده، دکمههای «قطع میکروفون» و «خروج از کلاس» زیر نوار خانه پنهان میشدند.
- قلم Poppins برای بخش لاتین رابط اضافه شد و پیش از Peyda تعریف شده است تا متن انگلیسی آن را بگیرد و فارسی — که Poppins نویسهای برایش ندارد — به قلم قبلی برسد. مجموعهٔ آیکونهای برنامهٔ نصبشده نیز بازتولید شد.
- گام پایانی فرمهای چندمرحلهای، پاسخها را بهشکل کارتهایی نمایش میدهد که با فشردن هرکدام میتوان همان پاسخ را اصلاح کرد.
- کارت هر نقش دوازده دسترسی را نشان میدهد و باقی را پشت یک تراشه جمع میکند.
- برگههای حضور و غیاب، «کلاس» یا «جلسه» را همانطور مینویسند که در سرفصل ثبت شده است.
---
یاسیار
بستهٔ دانش دستیار برای تمام آنچه در این نسخه افزوده شد بازتولید شد. همچنین فهرست تبهای داشبورد که پیشتر ثابت و دستی نوشته شده بود، اکنون از خودِ منوی برنامه استخراج میشود — پیش از این، تب «پیامها» افزوده شده بود اما آن فهرست بهروز نشده بود و یاسیار دربارهٔ تبی که مقابل چشم پرسشگر بود پاسخ میداد «چنین تبی نداریم».