Syntax | سینتکس – Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
وضعیت برنامه نویسا چند وقت دیگه

#fun

@Syntax_fa
😁32👀61
مامانم گفت کیس کامپیوترتو دادم به همسایه‌مون چون "فقط خاک می‌خورد". دارم می‌رم خونه اگه منظورش سرورم باشه... امیدوارم که اشتباه شده باشه.

#fun

@Syntax_fa
😁493
توضیح ساده مفهوم Anti-Corruption Layer (ACL):

فرض کن یه سیستم خیلی تمیز و مرتب ساختی، که از UILD برای IDها استفاده می‌کنه. حالا یه روز سرویس‌های دیگه‌ای میان که می‌خوان به سیستم تو وصل بشن. مثلاً یه اپلیکیشن که از INT برای user_id استفاده می‌کنه یا یکی دیگه که UUID استفاده می‌کنه.

حالا اگه تو مستقیماً اون INT یا UUID رو وارد سیستم خودت کنی، داری فساد رو وارد دنیای تمیزت می‌کنی، این میشه corruption.

Anti-Corruption Layer
یه لایه محافظه که جلوی این آلودگی رو می‌گیره. یعنی وقتی یه سرویس خارجی با مدل دیتا خودش با تو حرف می‌زنه، ACL میاد اون رو تبدیل می‌کنه به مدل خودت.

مثال از سرویس نوتیفیکیشن:
تو سرویس نوتیفیکیشن قراره از user_id توی بخش‌های مختلف استفاده شه. ولی به این دلیل که سرویس‌های خارجی ممکنه IDها با تایپ های مختلفی بفرستن (INT UUID و...)، نباید این تنوع رو بیاری داخل سرویست.

پس چی کار میشه کرد؟
1. اول چک می‌کنی که externalUserID ارسالی ULID هست یا نه.
2. اگه نیست، می‌ره تو کش cache یا دیتابیس دنبال اینکه آیا قبلا برای این external ID یه ULID تولید شده یا نه.
3. اگه نیست، خودش یه ULID جدید می‌سازه و نگه می‌داره.
4. از اون به بعد، هر بار external ID بیاد، همون ULID رو برمی‌گردونه و تو هر کجا که به user_id نیاز داریم ازش استفاده میکنیم.

یعنی:
* سیستم‌های خارجی می‌تونن هر جور ID بفرستن.
* سرویس نوتیفیکیشن همیشه با یک مدل استاندارد ULID کار می‌کنه.


مزایا:
* ساختار داخلی سیستم از تغییر و شلختگی سرویس‌های خارجی مصون می‌مونه.
* یکپارچگی و استاندارد بودن دیتای داخلی حفظ می‌شه.

#anti_corruption_layer #ACL

@Syntax_fa
👍92👏2
رائفی‌پور:
رفتم چک کردم گیت‌هابشونو
دقیقا 1666 کامیت زده بود! حتما توطئه ای در جریانه و برنامه نویس فراسونر هاست

#fun

@Syntax_fa
😁221👎1
الگوی Profile model

تا حالا به این مشکل برخوردید که توی پروژه‌تون دو نوع کاربر دارید؟ مثلاً «خریدار» و «فروشنده»؟
خریدار فقط نام و ایمیل داره، اما فروشنده کلی اطلاعات اضافه مثل «نام فروشگاه»، «آدرس» و «شماره صنفی» هم داره.

اینجا چند تا راه به ذهن میاد:
راه حل بد: همه‌ی فیلدها رو توی یک مدل User بریزیم (که برای خریدارها کلی فیلد NULL و خالی ایجاد می‌کنه و مدل رو شلوغ می‌کنه).
راه حل پیچیده: برای هر کدوم یک مدل User جدا بسازیم(که مدیریت احراز هویت و دسترسی‌هارو سختش می کنه)

الگوی پروفایل (Profile Model Pattern)


یک مدل User مرکزی داشته باشید: این مدل فقط مسئول اطلاعات مشترک و احراز هویته (نام کاربری، ایمیل، پسورد و ...)

یک مدل Profile جدا بسازید: برای اطلاعات اضافی، یک مدل جدید (مثلا SellerProfile) بسازید و تمام فیلدهای مخصوص فروشنده رو داخل اون قرار بدید.

با OneToOneField وصلشون کنید: این دو مدل رو با یک رابطه یک-به-یک به هم متصل کنید.

#profile_model_pattern

@Syntax_fa
👍181
یه کانال برنامه نویسیه شخصی درست می کنم میذارم تو پروفایلم تا بقیه با استایل خاصم آشنا بشن

#fun

@Syntax_fa
😁53💩21👍1
Forwarded from Zhino | ژینو (mahdi)
🌟 چیت‌ها یا همون ابزار تقلب در بازیهای آنلاین چطور کار می‌کنند؟

به طور کلی در بازی‌های آنلاین دو عامل وجود دارد که با همکاری یکدیگر می‌شه به طور آنلاین با بازیکنان دیگه یه بازی آنلاین بازی کرد.

🧑‍💻 کلاینت (Client): سیستم بازیکن که رندر گرافیک، ورودی کاربر و ارسال اطلاعات رو انجام می‌ده.

💡 مثال: اگر بازی شوتر باشه اطلاعاتی مثل
مکان دقیق بازیکن، شلیک تیر، نارنجک و ...


☁️ سرور (Server): هماهنگ‌کننده اصلی که داده‌های همه بازیکنان رو دریافت و تحلیل می‌کنه و تصمیم می‌گیره چه اتفاقی‌هایی باید بیفته.

💡 مثال: بازی اگر بازی شوتر باشه اطلاعات شلیک گلوله رو از کلاینت اول میگیره
و اطلاعات مکان بازیکن رو از کلاینت دوم میگیره. هر‌موقع که این دو مختصات روی‌هم منطبق شدند به پلیر ۲ دمیج وارد می‌شه.


🧩 خب کسایی که ابزار تقلب یا همون چیت میسازن دقیقا چه‌کاری انجام می‌دن؟ 🤔

معمولا با دستکاری فایل‌های بازی، حافظه‌ی اجرایی یا ساختار داده‌های سمت کلاینت، رفتار بازی رو عوض می‌کنن. این کار می‌تونه با روش‌هایی مثل مهندسی معکوس، تزریق کد یا ویرایش موقتی حافظه انجام بشه.


🧩 آیا چیت‌سازها از سرور بازی هم میتونن استفاده کنند؟ 👀

چون این کار نیازمند نفوذ غیرمجاز به سرور است و ریسک قانونی و امنیتی بالایی داره، معمولا مورد استفاده قرار نمی‌گیره. البته برای اینکار نیاز به مهارت‌های هک و نفوذ هم نیاز دارن.


🤖 چی باعث میشه که یک بازیکن از ابزار تقلبی استفاده کرده شناسایی بشه؟

آنتی‌چیت‌ها معمولا به دو نوع اصلی تقسیم می‌شن:

— نوع اول: یه سری که روی سیستم بازیکن اجرا می‌شن، مثل Easy Anti-Cheat یا BattleEye، که حافظه، فایل‌های DLL و فعالیت‌های مشکوک سیستم رو زیر نظر دارن.

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

👈 مثالی از نحوه شناسایی:
– اگر حداکثر سرعت مجاز یک بازیکن 5 واحد بر ثانیه باشد، اما داده‌های ارسالی از کلاینت نشون بده که در یک فریم از مختصات (0,0) به (0,10) رسیده، سرور یا آنتی‌چیت می‌تونه این مورد رو به عنوان حرکت غیرمجاز ثبت کنه.

⚠️ البته بررسی کامل این رفتارها منابع زیادی مصرف می‌کنه، برای همین بعضی بازی‌ها فقط موارد خاص رو بررسی می‌کنن یا از سیستم‌های گزارش‌دهی بازیکنان استفاده می‌کنند.


🎖 چیت‌های پراستفاده و نحوه کارکردشان: خب حالا بیایید بررسی کنیم که چیت های پر استفاده چطوری کار میکنن.

*⃣ اِیم‌بات [Aimbot]:

از حافظه‌ی RAM بازی موقعیت دقیق دشمن‌ها رو استخراج می‌کنه. با استفاده از توابع حرکتی موس یا تزریق DLL، موس رو به‌صورت مصنوعی به مختصات دشمن می‌بره. معمولا با FPS بازی هماهنگ میشه تا طبیعی‌تر به‌نظر برسه (و آنتی‌چیت سخت‌تر متوجه بشه).

*⃣ وال‌هک [Wallhack]:

بازی معمولا اطلاعات بقیه بازیکنان رو به دلیل سینک [Synchronizing] بهتر برای کلاینت ها میفرسته. از حافظه یا GPU این اطلاعات رو استخراج میکنن و به صورت باکس یا اسکلت بهم نمایش میدن.

*⃣ اسپید هک [Speed hack]:

در برخی بازی‌ها سرعت حرکت در RAM نگهداری میشه. چیت با تغییر اون مقدار، سرعت بازیکن رو بالا میبره. بعضی وقتا هم با دست‌کاری Time Scale این کار انجام میشه (مثل فریم‌ریت فیک).

⚠️ این نوع چیت معمولا راحت شناسایی می‌شه چون داده‌های غیرعادی برای سرور میفرسته.


*⃣ تریگر بات [Triggerbot]:

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


🔥 در آخر یادم نره بگم که به طور خلاصه  چیت‌ها از روش‌های زیر ساخته میشن:

🟡 Memory Editing:
داده‌های در حال اجرا در RAM رو تغییر میده.

🟡 DLL Injection:
کد جدیدی وارد فرآیند بازی میکنه.

🟡 Hooking APIs :
توابع گرافیکی یا کنترلی بازی رو تغییر میده.

🟡 Packet Editing:
غیر رایجه؛ بسته‌های شبکه رو تغییر میده (معمولا قابل شناسایی توسط سرور)

🟡 External Programs:
بدون دخالت مستقیم، با گرفتن اسکرین، مکان دشمن رو تشخیص میده.


*⃣ #Game #Article
💎 Channel:
@ZhinoDev
🔥153💩1👌1
از کدوم بیشتر استفاده می کنید؟
Anonymous Poll
60%
gpt
14%
gemini
8%
claude
10%
grok
9%
others
7👍2
Syntax | سینتکس
از کدوم بیشتر استفاده می کنید؟
حرف هوش مصنوعی شد.
من هوش مصنوعیمو به تلگرام وصل کردم.
الان توی گروه سینتکس‌فا هستش.

تو گروه پیام بدید و سعی کنید باهاش ارتباط برقرار کنید تا با یه هوش مصنوعی خیلی متفاوت روبرو بشید


فعلا خاموشه
👻171
PgBouncer
ابزاری برای مدیریت کانکشن های پستگرس

چه زمانی میشه ازش استفاده کرد؟

اپلیکیشن‌های وب با ترافیک بالا:
این اصلی‌ترین کاربرد PgBouncer است. در اپلیکیشن‌هایی مثل جنگو، هر درخواست (request) کاربر ممکنه نیاز به یک کانکشن به دیتابیس داشته باشه. ساختن و از بین بردن کانکشن در PostgreSQL یک عملیات سنگین و پرهزینه‌ست (چون به ازای هر کانکشن یک پروسس جدید در سیستم‌عامل ایجاد می‌کنه). PgBouncer با نگه داشتن یک استخر (pool) از کانکشن‌های آماده، این هزینه رو به صفر نزدیک می‌کنه.

محیط‌های Serverless یا Function-as-a-Service (FaaS):
در پلتفرم‌هایی مثل AWS Lambda، هر اجرای تابع یک محیط ایزوله و کوتاه‌مدته. شما نمی‌تونید یک کانکشن دائمی به دیتابیس داشته باشید. بدون یک connection pooler مثل PgBouncer، دیتابیس شما با هزاران درخواست اتصال و قطعی بمباران می‌شه.

معماری میکروسرویس:
وقتی تعداد زیادی سرویس کوچک دارید که همگی به یک دیتابیس متصل می‌شن، مدیریت کانکشن‌ها می‌تونه از کنترل خارج بشه. PgBouncer به عنوان یک دروازه (gateway) عمل می‌کنه و این هرج و مرج رو مدیریت می‌کنه.

اپلیکیشن‌هایی با کانکشن‌های کوتاه‌مدت و زیاد:
هر نرم‌افزاری که در بازه‌های زمانی کوتاه تعداد زیادی کانکشن به دیتابیس باز و بسته می‌کنه، کاندیدای اصلی استفاده از PgBouncer است.

فایل docker compose که از PgBouncer استفاده شده تو یک پروژه جنگویی:
https://github.com/syntaxfa/django-structure/blob/main/compose.yml

نکته:
از نسخه bitnami بجای edoburu استفاده شده چون:
میشه با متغیر های محیطی پیکربندی کرد. خودم شخصا بیشتر دوست دارم بجای mount کردن فایل داخل خود فایل docker compose بتونم کانفیگ هارو اضافه کنم.
امنیت ایمیج bitnami خوبه و توسط شرکت غولی پشتیبانی میشه.

#PgBouncer

@Syntax_fa
👍72🔥1
🚀 آموزش فعال‌سازی مدل‌های قدیمی ChatGPT

با انتشار نسخه 5 چت‌جی‌پی‌تی، بسیاری از مدل‌های قدیمی دیگر به‌صورت پیش‌فرض نمایش داده نمی‌شوند.

اما همچنان می‌توانید به آن‌ها دسترسی داشته باشید! کافیست مراحل زیر را دنبال کنید:

1️⃣ وارد حساب کاربری خود شوید و به بخش Settings بروید.
2️⃣ در تب General، گزینه Show additional models را فعال کنید.

📌 با این روش، مدل‌های قدیمی دوباره در لیست شما نمایش داده می‌شوند و می‌توانید از آن‌ها استفاده کنید.

Source
👍112👏1
سرور بازی ماینکرفت

تو این ریپو docker compose سرور ماینکرفت هم برای JAVA server و هم bedrock رو قرار دادیم.
در کنار کد، گیم هم بزنید خوب است 🍸

https://github.com/alireza-fa/minecraft-server

#fun

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍21👻1
از آپدیت جدید تلگرام چخبر ☹️

اضافه کردن موزیک تو پروفایلتون:
تلگرامم از اینهمه کانال شخصی که زده بودید تا ملت رو با سلیقه خاص موزیکتون آشنا کنید خسته شده و این قابلیت رو اضافه کرده.
کافیه یه آهنگو پلی کنید، بعد رو گزینه Add to profile بزنید.

#fun

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15😁7👍21👀1
This media is not supported in your browser
VIEW IN TELEGRAM
Programming in iran

#fun

@Syntax_fa
😁241❤‍🔥1👍1👀1
فایل آپلود شده رو فقط با پسوندش چک می‌کنی؟ بیخیال!

تاحالا شده کاربر فایلی رو آپلود کنه و شما فقط پسوندش ( jpg یا pdf) رو چک کنید و با خوشحالی بگید کار تمومه؟ اگه اینطوره، باید بگم که یه جای کار حسابی می‌لنگه!

کاربر به راحتی می‌تونه یک فایل مخرب (مثلاً یه اسکریپت) رو به virus.png تغییر نام بده و سیستم شما رو دور بزنه.

راه حل چیه؟ کتابخونه python-magic

این پکیج یک رابط (Wrapper) برای کتابخونه قدرتمند libmagic در زبان C هست. کار اصلیش اینه که بیخیال اسم و پسوند فایل بشه و بره سراغ اصل مطلب محتوای خود فایل.

مجیک چند بایت اول یک فایل (که بهش هدر یا Magic Numbers می‌گن) رو می‌خونه و از روی اون امضای دیجیتالی، نوع واقعی فایل رو تشخیص می‌ده.

مثال:
import magic
from django.core.files.uploadedfile import InMemoryUploadedFile

def get_mime_type_from_content(file: InMemoryUploadedFile) -> str:
"""Reads the initial bytes of a file to determine its actual MIME type."""
try:
initial_bytes = file.read(2048)
file.seek(0)
return magic.from_buffer(initial_bytes, mime=True)
except Exception as err:
raise Exception(f"Failed to detect MIME type: {err}")

def check_file_is_image(file: InMemoryUploadedFile) -> bool:
"""Check if the uploaded file is an image based on its MIME type."""
try:
mime_type = get_mime_type_from_content(file)
return mime_type.startswith("image/")
except Exception as err:
print(f"[ERROR] check_file_is_image: {err}")
return False


#libmagic #python_magic

@Syntax_fa
13👍6
مفهوم Trade-off در توسعه نرم‌افزار
(تعادل میان مزایا و معایب در تصمیم‌های فنی)

در توسعه نرم‌افزار، هیچ تصمیمی رایگان نیست. هر انتخابی، در کنار مزایا، هزینه‌ها و محدودیت‌هایی هم دارد. Trade-off یعنی برقراری تعادل میان این مزایا و معایب، و انتخاب بهترین گزینه متناسب با شرایط واقعی پروژه.

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

و در دنیای نرم‌افزار:

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

تفاوت در معیارهای سنجش
نکته مهم دیگر این است که معیارهای سنجش در هر پروژه متفاوت است:

- یک استارتاپ ممکن است سرعت رسیدن به بازار را مهم‌تر بداند.
- یک سیستم بانکی احتمالاً امنیت و پایداری بلندمدت را در اولویت قرار می‌دهد.
- یک پروژه تحقیقاتی شاید بیشتر به انعطاف‌پذیری و نوآوری اهمیت دهد.

بنابراین حتی اگر دو تیم روی یک زبان یا فریم‌ورک واحد بحث کنند، ممکن است از زاویه‌های متفاوتی آن را ارزیابی کنند و به نتایج متفاوتی برسند.


به همین دلیل، انتخاب زبان، ابزار یا فریم‌ورک هیچ‌وقت یک پاسخ مطلق «بهترین» ندارد.
سؤال درست این نیست که کدام بهترین است؟
بلکه این است که کدام گزینه با توجه به نیازهای فعلی پروژه و توان تیم، بهترین تعادل (Trade-off) را فراهم می‌کند؟

Source

#trade_off

@Syntax_fa
👍111🔥1
Jules
آشنایی با دستیار کدنویسی هوش مصنوعی گوگل

یکی از جدیدترین و قدرتمندترین این ابزارها، Jules**، دستیار کدنویسی هوش مصنوعی گوگل است. اما Jules دقیقاً چیست و چه تفاوتی با سایر ابزارهای مشابه مانند Cursor دارد؟

Jules: یک همکار و معمار کد


ا Jules یک مدل زبان بزرگ (LLM) است که به عنوان یک همکار برنامه‌نویس (AI Pair Programmer) طراحی شده است. برخلاف ابزارهایی که تنها به تکمیل کد یا پاسخ به سوالات کوتاه می‌پردازند، Jules می‌تواند یک پروژه کامل را تحلیل کرده و در انجام تسک‌های پیچیده به شما کمک کند.

روند کاری با Jules به صورت گفتگو محور و مبتنی بر تسک است. شما به عنوان یک توسعه‌دهنده:
1. سورس کد را شیر می کنید: Jules با دریافت سورس کد، یک دید جامع و کامل از معماری، وابستگی‌ها و الگوهای کدنویسی پروژه شما پیدا می‌کند.
2. تسک را تعریف می‌کنید: شما نیازمندی‌های خود را به زبان ساده بیان می‌کنید. برای مثال: «یک قابلیت جدید برای ثبت‌نام مشتری توسط فروشنده اضافه کن.»
3. راه‌حل دریافت می‌کنید: Jules با تحلیل کل پروژه، کد مورد نیاز را تولید کرده و به شما ارائه می‌دهد. این کد نه تنها سینتکس درستی دارد، بلکه با ساختار و الگوهای موجود در پروژه شما نیز هماهنگ است.
4. تست و بازخورد می‌دهید: شما کد را در محیط توسعه خود اجرا و تست می‌کنید. در صورت وجود مشکل یا نیاز به تغییر، بازخورد خود را به Jules می‌دهید تا راه‌حل را اصلاح کند.

نکته کلیدی این است که Jules مستقیماً کد را اجرا نمی‌کند، بلکه به عنوان یک معمار و متخصص عمل می‌کند که بهترین راه‌حل را بر اساس تحلیل عمیق پروژه پیشنهاد و تولید می‌کند.


مقایسه Jules با سایر دستیارهای هوش مصنوعی (مانند Cursor)

برای درک بهتر جایگاه Jules، می‌توان آن را با ابزارهای دیگری مانند Cursor مقایسه کرد.

با Cursor: شما یک تابع را انتخاب کرده و می‌نویسید: "این تابع را بهینه‌تر کن" یا "برای این کد تست بنویس". Cursor تغییرات را مستقیماً در همان فایل اعمال می‌کند.

با Jules: شما کل پروژه را آپلود کرده و می‌گویید: "سیستم احراز هویت ما نیاز به بازنگری دارد تا از حملات Brute-force جلوگیری کند. بهترین راه‌حل چیست؟

انتخاب بین Jules و Cursor به نیاز شما بستگی دارد.

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

اما اگر برای حل مسائل پیچیده، طراحی معماری، پیاده‌سازی یک قابلیت جدید از صفر تا صد یا بازنگری (Refactoring) بخش‌های بزرگ پروژه به یک همکار هوشمند نیاز دارید، Jules با درک عمیق و جامع خود از کل پروژه، بهترین گزینه است.

https://jules.google.com/

#jules

@Syntax_fa
10🔥4👍1
لاگ‌هات رو بریز توی تلگرام

تصور کن:

* یک ارور Critical در اپلیکیشن شما اتفاق میفته.
* بلافاصله، یک نوتیفیکیشن با اموجی ‼️ روی گوشیت میاد.

چرا تلگرام؟


1. فوری و همیشه در دسترس: کیه که تلگرام رو روی گوشیش نداشته باشه؟
2. فرمت‌بندی عالی: می‌تونید پیام‌ها رو با Markdown خوشگل کنید، کدها رو متمایز کنید و با اموجی، سطح خطا رو مشخص کنید.
3. رایگان و بی‌دردسر: ساختن ربات تلگرام رایگانه و API اون بسیار ساده و قدرتمنده.
4. گروهی و تیمی: می‌تونید لاگ‌ها رو تو یه گروه تلگرامی بفرستید تا کل تیم فنی در لحظه از وقایع باخبر بشن.

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

import logging
import requests
from database import settings # Assuming settings are read from here

# --- Settings ---
# Load settings like bot token and admin ID from a central settings module
config = settings.get_all()
LOG_LEVEL = logging.INFO # Only send INFO level and higher logs
BOT_TOKEN = config.get('control_bot', {}).get('token')
ADMIN_ID = config.get('telegram', {}).get('admin_ids', [None])[0]
CHAT_ID = settings.get('logging.telegram_chat_id', ADMIN_ID)


class TelegramLogHandler(logging.Handler):
"""
A custom logging handler that sends log records to a Telegram chat.
"""
def __init__(self, token, chat_id):
super().__init__()
self.token = token
self.chat_id = chat_id

def emit(self, record):
"""
Formats and sends the log record.
This method is called by the logging framework.
"""
if not self.token or not self.chat_id:
return # Do nothing if token or chat_id is not set

log_entry = self.format(record)

# Use a simple emoji prefix for different log levels
if record.levelno >= logging.CRITICAL:
prefix = "‼️ CRITICAL"
elif record.levelno >= logging.ERROR:
prefix = " ERROR"
elif record.levelno >= logging.WARNING:
prefix = "⚠️ WARNING"
else:
prefix = "ℹ️ INFO"

# Format the message with level, service name, and log content
message = f"{prefix}\n**Service:** `{record.name}`\n**Message:** `{log_entry}`"

url = f"https://api.telegram.org/bot{self.token}/sendMessage"
payload = {
'chat_id': self.chat_id,
'text': message,
'parse_mode': 'Markdown'
}
try:
requests.post(url, data=payload, timeout=5)
except requests.RequestException as e:
# If sending the log to Telegram fails, print the error to the console
print(f"Failed to send log to Telegram: {e}")


def setup_telegram_logging():
"""
Sets up the custom Telegram handler for the root logger.
Call this function once at the start of each service.
"""
if CHAT_ID and BOT_TOKEN:
# Get the root logger
logger = logging.getLogger()

# Create a handler and set its level
telegram_handler = TelegramLogHandler(BOT_TOKEN, CHAT_ID)
telegram_handler.setLevel(LOG_LEVEL)

# Create a formatter and add it to the handler
formatter = logging.Formatter('%(message)s')
telegram_handler.setFormatter(formatter)

# Add the handler to the root logger
logger.addHandler(telegram_handler)
logger.info("Telegram logging handler has been set up.")


چطور راه اندازی کنیم؟

1. ساخت ربات تلگرام: به BotFather در تلگرام پیام بدید، دستور /newbot رو بزنید و یک ربات بسازید.

3. فراخوانی در پروژه:
کافیست در ابتدای فایل اصلی اپلیکیشن خود (مثلاً main.py)، پکیج logging پایتون رو ایمپورت کنید و تابع setup_telegram_logging را فراخوانی کنید.

قدم بعدی چیه؟

* برای سرویس‌های مختلف، از CHAT_ID های متفاوت استفاده کنید.
* به پیام‌های خطا دکمه‌های شیشه‌ای (Inline Buttons) اضافه کنید؛ مثلاً دکمه "Restart Service" یا "View Full Traceback".
* سطح لاگ‌ها را بر اساس محیط (Development/Production) تغییر دهید.
* حواستون باشه تلگرام نباید تنها مکانی باشه که لاگ هاتون ذخیره میشه.

#telegram #logging

@Syntax_fa
👍7🔥52