Skip to content

Arman17Babaei/fop98

Repository files navigation

در این‌جا به توضیح توابع استفاده شده در پروژه می‌پردازیم.

CLIENT

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

phew.h

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

page struct

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

بخش کلاینت شامل سه صفحه‌ی start، main و chat است که به صفحه‌های ورود، پروفایل کاربری، و چت هستند.

void modify_to_start()

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

void clear()

صفحه‌ی ترمینال را پاک می‌کند تا داده‌های قبلی دیده نشوند.

void setstr(char* s1, char* s2)

همان strcpy بی هیچ تفاوتی :)

void set_color(int bold, char* str)

به کمک این تابع رنگ متن نوشته شده در ترمینال به str تغییر می‌کند (مقادیر مجاز gray و red و green و yellow و blue و magneta و cyan و white هستند) و در صورتی که bold صفر نباشد، متن نوشته شده به‌صورت پررنگ نمایش داده می‌شود.

void reset_color()

رنگ متن نوشته شده در ترمینال را به رنگ عادی برمی‌گرداند.

void combine(char* res, int cnt, ...)

به تعداد cnt رشته از ورودی‌های انتهایی را به هم می‌چسباند و حاصل را در res ذخیره می‌کند.

void send_message(char* message)

مطابق روش‌های ارائه شده، پیام درون message را برای سرور ارسال می‌کند.

page_handler.h

در این قسمت صفحه‌ها نمایش داده می‌شوند و به صفحه‌ها ورودی داده می‌شود.

void page_maker()

سه صفحه‌ای که پیشتر به آن‌ها اشاره شد را آماده می‌کند. (در ادامه به این که هر صفحه چه مراحلی برای آماده شدن طی می‌کند اشاره خواهیم کرد)

void make_view()

صفحه را پاک کرده و سپس صفحه‌ای که باید نشان داده شود را در صفحه‌ی ترمینال نمایش می‌دهد.

void get_input()

ورودی را از ترمینال گرفته و به تابع مفسر صفحه‌ای که در ترمینال قرار دارد، تحویل می‌دهد.

start_page.h

این صفحه همان صفحه‌ایست که قبل از ورود به کاربر نمایش داده می‌شود.

void make_start_page()

در این تابع، مقادیر اولیه، نظیر مقادیر گزینه‌های مختلف و تابع مفسر صفحه‌ی شروع تعیین می‌شوند.

void start_page_interpreter(char* input)

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

void login_user(char* input)

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

void register_user(char* input)

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

main_page.h

این صفحه اجازه‌ی مدیریت حساب را به کاربر می‌دهد.

void make_main_page()

در این تابع، مقادیر اولیه، نظیر مقادیر گزینه‌های مختلف و تابع مفسر صفحه‌ی شروع تعیین می‌شوند.

void start_page_interpreter(char* input)

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

void logout()

به سرور درخواست خروج کاربر را ارسال می‌کند.

void join_channel(char* input)

به سرور درخواست ورود به کانال را ارسال می‌کند.

void create_channel(char* input)

به سرور درخواست ایجاد کانال را ارسال می‌کند.

chat_page.h

در این قسمت به صفحه‌ی چت پرداخته می‌شود.

void make_chat_page()

در این تابع، مقادیر اولیه، نظیر مقادیر گزینه‌های مختلف و تابع مفسر صفحه‌ی شروع تعیین می‌شوند.

void chat_page_interpreter(char* input)

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

void leave_channel()

درخواست ترک کانال را به سرور ارسال می‌کند.

void get_channel_members()

درخواست مشاهده‌ی کاربران را به سرور ارسال و نتیجه را نمایش می‌دهد.

void refresh()

درخواست مشاهده‌ی پیام‌های جدید را به سرور ارسال و نتیجه را نمایش می‌دهد.

void send_user_message(char* input)

پیام کاربر را سرور ارسال می‌کند.

main.c

int main()

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

SERVER

server.c

struct User

شامل نام‌کاربری، گذرواژه، شماره‌ی کانال، وضعیت آنلاین بودن و آخرین پیام مشاهده شده توسط کاربر.

struct Message

شامل شماره پیام، کانال پیام، نام نویسنده و محتوای آن است. (از این ساختار فعلا استفاده نشده است)

struct Channel

شامل نام کانال، شماره‌ی اختصاص‌یافته به اعضای کانال (به ترتیب ورود به سیستم)، تعداد پیام‌ها و تعداد اعضاست.

void init_server();

مطابق روش‌های ارائه شده، سرور را روی پورت ۱۲۳۴۵ در لوکال‌هاست بالا آورده و مدام منتظر اتصال کلاینت جدید می‌ماند و در صورت اتصال، وظیفه دریافت پیام بر عهده تابع process است.

void process(int client_socket);

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

int main();

مدام سرور را راه‌اندازی می‌کند (در واقع فقط یک بار راه‌اندازی می‌شود که در ادامه خواهیم دید)

void setstr(char* str1, char*str2);

عین strcpy.

void combine(char* res, int cnt, ...);

با ورودی گرفتن یک آدرس رشته، یک تعداد رشته‌های دیگر، و رشته‌های دیگر رشته‌های دیگر را به هم چسبانده و در res آدرس گرفته شده ذخیره می‌کند.

void make_auth(User* user) ;

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

void save_user(User* user);

با ورودی گرفتن یک کاربر اطلاعات او را در فایل مربوطه در data/Users‍ ذخیره می‌کند.

void save_channel(Channel* channel);

با ورودی گرفتن یک کانال، نام آن را به فایل data/Channels.data اضافه می‌کند.

void save_messages(Message* message);

با ورودی گرفتن یک پیام، آن را در محل مربوطه (ر.ک. add_message) اضافه می‌کند. فعلا از این تابع استفاده نمی‌شود.

User* init_user(char* username, char* password);

با ورودی گرفتن دو متن (نام کاربری و گذرواژه) ساختار کاربری ایجاد کرده و آن را ذخیره می‌کند. از این تابع هم فعلا استفاده نمی‌شود.

char* register_user(char* buffer);

با ورودی گرفتن نام کاربری و گذرواژه، در صورت وجود نداشتن آن‌ها کاربر را به `data/Users' در قالب یک فایل شامل نام کاربری و گذرواژه ذخیره میکند و پیام مقتضی را خروجی می‌دهد.

char* login_user (char* buffer);

با ورودی گرفتن نام کاربری و گذرواژه، در صورت صحیح بودن آن‌ها کاربر را به لیست کاربرهای آنلاین اضافه می‌کند و پیام مقتضی را خروجی می‌دهد.

char* create_channel(char* buffer);

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

void load_channels();

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

char* join_channel(char* buffer);

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

char* send_message(char* buffer);

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

void add_message(User* user, Channel* channel, char* message);

با ورودی، گرفتن یک کاربر، یک کانال، و یک متن، در فایل متنی‌ای در آدرس data/Messages با نام "channel"_"message_id" به صورت ابتدا نام فرستنده و بعد متن پیام ذخیره می‌شود.

int get_last_message(Channel* channel);

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

int to_num(char* str);

با ورودی گرفتن یک رشته، مقدار عدد درون آن رشته را برمی‌گرداند.

char* refresh(char* buffer);

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

char* wrong(char* buffer);

پیام مربوط به غلط بودن دستور وارده توسط کلاینت را خروجی می‌دهد.

char* get_members(char* buffer);

با ورودی گرفتن توکن، پس از پیدا کردن توکن کاربر در میان کاربرهای آنلاین، کانال او را پیدا کرده و کاربرهای آنلاین آن کانال را (در صورت وجود) پیدا کرده و پیام مقتضی را خروجی می‌دهد.

char* leave(char* buffer);

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

char* logout(char* buffer);

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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published