سایت خود را بسازید ، به روش saalek110

saalek110

Well-Known Member
صفحه ۳۲:

فروم الان کار می کنه و کمی باید فکر کنم تگ ها چی باشه تا دکمه ها را به ادیتور اضافه کنم.

قسمتهای مدیریت را هم تلاش می کنم کار کنیم.
 

saalek110

Well-Known Member
فایل دیلت را هم ساختم با کویری زیر:

PHP:
$sql = "DELETE FROM posts WHERE number=$post_number";

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

PHP:
mysqli_set_charset($conn, "utf8");     // yaftane topici ke bodim
$sql = "SELECT * FROM posts WHERE  number=$post_number";
$result = mysqli_query($conn ,$sql );
while($info = mysqli_fetch_array( $result ))
        {
             $topic_number=$info['topic'];
        }//while

این شد چهارمین فایلی که پیام میده:

Screenshot_16.png
 

saalek110

Well-Known Member
موقع نمایش پست ستون user را هم بخوان . بعد ببین سسیون خواننده با اون برابره یا نه. اگر برابر باشه یعنی اون پست متعلق به خواننده است. و لینک به فایل دیلت یا ادیت را بهش بده.

PHP:
$str="delete";
     if ( $_SESSION["username"] == $user )   
           echo'<a href="delete_post.php?number='.$post_number.'">'.$str.'</a>';
 

saalek110

Well-Known Member
داخل فایل دیلت و ادیت را هم این چک را بکن:

PHP:
if ( $_SESSION["username"] == $user )   //aya khode saheb posteh
{// Auth
 if(  !   isset($_POST['act']))
{
     ....
         .....
         .....
         ......

سلب مسولیت:
سالک: اینها ساخته های ذهن من است ، از جای معتبری نیست ، تضمین امنیت ندارد.

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

یعنی آماده باش که هک بشی و برای بعد هک هم برنامه داشته باش.


سالک: من متخصص امنیت نیستم. و نظری دراین مورد ندارم.
 
آخرین ویرایش:

saalek110

Well-Known Member
ادمین هم باید بتواند هر پستی را ادیت و دیلت کند:
PHP:
if ( $_SESSION["username"] == $user  || $_SESSION["username"] == "َAdmin" )   //aya khode saheb posteh
{// Auth
 if(isset($_POST['act'])) 
 {// if action
 

saalek110

Well-Known Member
Div داخل div :

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

Screenshot_۲۰۲۴-۰۹-۱۱_۰۶۴۶۳۲.jpg

PHP:
                   echo"<div id='forum'>";



    echo"<div id='forum_inner'>";
echo"<a href='http://saalek110.is-great.net/forum/forum.php?number=$forum_number'>".$forum_name."</a>";

         echo"<div id='forum_desc'>";
              echo $forum_sharh;
         echo"</div'>";

    echo"</div'>";
                     echo"</div'>";
در بالا ، کدش را گذاشتم. و مسلما ۳ تا css داره هر div که من بالای صفحه css ها را می نویسم. بین همون تگ استیل و هد.
 

saalek110

Well-Known Member
چاپ div اگر شرایطی برقرار بود:

PHP:
if ($user=="hamid")
{
    echo"<div id='user_darajeh'>";
    echo"Active";
    echo"</div>";
}

در کد بالا ، اگر یوزر حمید باشه ، زیر اسمش نوشته میشه Active.
نکته اش اینه که باز و بسته شدن div هم در کروشه گذاشته شده. اگر این طوری ننویسیم ، برای همه غیرحمید ها یک کادر خالی ایجاد خواهد شد و این خوب نیست. کد زیر اشتباه است:

PHP:
    echo"<div id='user_active'>";


if ($user=="hamid")  echo"Active";
   

    echo"</div>";

چون برای تمام کاربران یک کادر خالی ایجاد میشه و به یک نفر حمید لقب اکتیو داده میشه. اون کادرهای خالی زیبا نیست.

کلا منظورم اینه ادوات بصری و چاپ را هم باید کروشه داخل شرط گذاشت تا اگر شرط برقرار نبود چیزهای قاب و حاشیه خالی چاپ نشود،
 

saalek110

Well-Known Member
تگ کد را ساختم.از phpbb یاد گرفتم نمونه اش:


برای ساختش در ادیتور این را بیاندازید:
PHP:
[code]
[/CODE]

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

بعدش در فایل replace به جای تگ ها اینها را بزارید:
PHP:
<pre><code>

</code></pre>

PHP:
     $post=str_replace("[code]","<div id='code-kadr'><pre><code>",$post);
     $post=str_replace("
","</code></pre></div>",$post);
[/CODE]

باز هم تداخل کرد با تگ های فروم مجید آنلاین و خط دومش ریخت بیرون. از روی خط اول بفهمید خط دوم چیه.

یک div هم در css خودتون برایش بسازید و direction را و text-align را درش تنظیم کنید. شاید هر دو نیاز نباشه ، خودتان چک کنید.
CSS:
                direction: ltr;
                 text-align: left;

یک کادری هم دورش باشه و رنگ پس زمینه متفاوت هم فکر کنم داشته باشه بهتره:



البته تگ رنگ است کدهای phpbb ، در مجیدآنلاین که قالب بالتن است ، شاید با رگولار اکسپرژن کلمات را رنگی می کنند.
CSS:
        background-color:rgba(250,190,150,0.6);
        border:1px solid #eeff22;
        border-radius:5px;
 
آخرین ویرایش:

saalek110

Well-Known Member
خنثی سازی علامت کوچکتر و بزرگتر:

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



دیدید که اینجا هم خرابکاری شد و با تگهای مجیدآنلاین تداخل کرد.منظور از معادل کوچکتر و بزرگتر را بزارید سرچ کنم ببینم پیدا می کنم...

در اینجا:


گویا تابع htmlspecialchars این کارو انجام میده.


PHP:
& (ampersand)    &amp;
" (double quote)    &quot;, unless ENT_NOQUOTES is set
' (single quote)    &#039; (for ENT_HTML401) or &apos; (for ENT_XML1, ENT_XHTML or ENT_HTML5), but only when ENT_QUOTES is set
< (less than)    &lt;
> (greater than)    &gt;

مثال از همین لینک که بالاتر دادم:
PHP:
<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

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

saalek110

Well-Known Member
یادآوری اینکه در فیلتر محتویات همه ورودی های سایت من این ۳ تابع را قرار دادم:

PHP:
            $data = trim($data);
     $data = stripslashes($data);
     $data = htmlspecialchars($data);

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

برای درمان و علاجش اومدم الان این خط را انتهای فایل str_replace ام اضافه کردم:
PHP:
     $post = htmlspecialchars($post);

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

پس فعلا اون یک خط کد را از انتهای فایل str_replace برداشتم تا بعدا بفهمم راه حل چیه.

فایل str_replace موقع نمایش اکلادها را تبدیل به کوچکتر و بزرگتر می کنه تا عملکرد html ئی داشته باشه و به پستها شکل و حالت بدهد.
کدهایی هم که کاربران در پستها می زنند ، قبلا با تابع htmlspecialchars خنثی سازی شده. ولی چرا وقتی دوباره خنثی سازی می کنیم از شکل درمیاد؟
چرا در مجیدآنلاین وقتی سورس را می بینیم در کدهای کاربران علامت کوچکتر بزرگتر نیست ولی در نمایش انتهایی علامتهای کوچکتر و بزرگتر هست؟

سورس تاپیک فروم خودم را هم دیدم، این لینکشه:

view-source:http://saalek110.is-great.net/forum/topic.php?number=62

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

و شاید علامت کوچکتر و بزرگتر که فایل str_replace من اضافه می کنه ، لازم است و نمیشه خنثی سازی بشه.
موردهایی بوده باعث دردسر شده ، شاید باید بروم اون مورد های خاص را بررسی کنم. و نباید کلا بگم علامت کوچکتر و بزرگتر نباید در ساماندهی پستها استفاده بشه.
 
آخرین ویرایش:

saalek110

Well-Known Member
افزودن ستون زمان به تاپیک ها:

در فرومها ، تاپیک جدید و قدیم داریم.
پس من یک ستون تایم به تاپیک اضافه کردم و در فایل create post که محل ایجاد پست است ، گفتم تایم تاپیک مربوطه را آپدیت کند.

SQL:
$sql="update topics SET time=$my_time WHERE number=$the_topic_number";

ورودی فایل create post ، محتوای پست و شماره تاپیک است. پس در آپدیت تایم تاپیک خود مشکلی ندارد.

در فایل create post داریم:

PHP:
$my_time=time();

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

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

Screenshot_۲۰۲۴-۰۹-۱۲_۱۵۳۵۴۲.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
بازدید به 9 هزار رسید.


مشکل دسترسی به ادیت عنوان تاپیک:

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

اگر بخواهیم چنین سیستمی را پیاده کنیم باید یک ستون به نام leader_post ایجاد کنیم و در اون کلمات مثلا yes و no را وارد کنیم.
من نمی دونم ساختار فرومها چطوری ست ولی سیستم پست فرمانده ، الان به نظرم قشنگ است و انجامش به نظرم منطقی می آید. البته ممکن است بعدا کار جالبی به نظر نیاید ، ولی فعلا برای دسترسی به ادیت عنوان تاپیک باید راهی انتخاب کنیم.
 

saalek110

Well-Known Member
پس من ستون leader_post را به جدول پستها اضافه کردم. دیفالت این ستون را no دادم ولی پست های قبلی این ستون اش خالی موند.
پس این را اجرا کردم در قسمت sql در همان php my admin:
کد:
UPDATE `posts` SET `leader_post`="no" WHERE 1
و باعث شد کل این ستون با no پر شود.
ولی بعضی سرپست بودند.خوبیش اینه هنوز کسی جز من تاپیک نساخته و من هم ، هر وقت لازم باشه می تونم در php my admin عنوان تاپیک ها را اصلاح کنم. من هر تاپیک را باز کردم و با نگه داشتن ماوس روی دکمه ادیت پست اول ، شماره پست را فهمیدم و رفتم در دیتابیس اون پست را ادیت کردم ، یعنی ستون سرپست را yes کردم. منظورم از سرپست همون ستون leader_post است.

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


و در فایل create post باید تغییراتی دهم. چون اونجا پست ساخته میشه. یک ورودی لیدر پست به ورودی هایش اضافه میشه.

در 3 جا شروع ساخت پست شروع میشد. یکی در تاپیک ، دیگری در فایل new post و دیگری در فایل ایجاد تاپیک. که در سومی متغیر leader_post باید yes بشود و در دو تای دیگر no بشود.
 
آخرین ویرایش:

saalek110

Well-Known Member
ادامه تغییرات:
تشخیص لیدر پست ها:
در فایل edit post ما اول محتوای پست را می خواندیم و بعد در textarea می انداختیم تا برای ادیت آماده شود.
حالا موقع خوندن پست ، ستون لیدر پست را هم می خوانیم. این طوری:


PHP:
  $leader_post=$info['leader_post'];

بعد این را اضافه می کنم:
PHP:
if($leader_post=="yes") echo"yes";

می خواستم ببینم سیستم فرضی من درست کار می کند یا نه و درست کار کرد. یعنی وقتی پست من ، سرپست بود کلمه yes را چاپ می کرد.

حالا باید به جای چاپ yes ، کار ادیت عنوان تاپیک را جایگزین کنیم.

همون جا که ستون لیدر پست را خواندید ، ستون شماره تاپیک را هم بخوانید تا بتوانیم تاپیک مورد نظر را پیدا کنیم.
با خواندن تاپیک ها ، توسط شماره تاپیک ، عنوان تاپیک را به دست می آوریم.
 
آخرین ویرایش:

saalek110

Well-Known Member
کد فرم پر شده:


PHP:
if ( $_SESSION["username"] == $user || $_SESSION["username"] == "Admin")
{// Auth
 if(  !   isset($_POST['act']))   // nemikham bade zadane dokmeye form baz form beyad
{
    include"tools/my_buttons.php";  // dokme haye balaye editor
?>

<center>
 <form id='myform' action="<?php echo $_SERVER['PHP_SELF']; ?>"  method = 'POST'>
 
<?php
 if($leader_post=="yes")
{
$sql2 = "SELECT * FROM topics WHERE  number=$topic_number";
$result2 = mysqli_query($conn ,$sql2 );
while($info2 = mysqli_fetch_array( $result2 ))
        {
             $topic_title=$info2['title'];
           
        }//while

 echo'<textarea id="title_textarea"  form="myform" name="topic_title" rows="2" cols="70">';
  echo $topic_title;
 echo'</textarea><br><br>';

}  // if($leader_post=="yes")

?>


 <textarea id="mytextarea"  form="myform" name="post_text" rows="10" cols="70">
 <?php  echo $post;  ?>
 </textarea><br><br>

<?php
 
  echo'<input type="hidden" id="custId" name="post_number"  value='.$post_number.'>';
   echo'<input type="hidden" id="custId" name="topic_number"  value='.$topic_number.'>';
      echo'<input type="hidden" id="custId" name="leader_post"  value='.$leader_post.'>';
   ?>
 <center>
  <input type="submit"  name='act' form='myform' value="Submit"  style=" font-size:40px; height:90px; width:150px">   </center>


 
</form>
</center>



<?php
}    // if not action then show form
}//Auth

Screenshot_1.png

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

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

کد تغییر عنوان تاپیک هم یک update است و ساده است.
 
آخرین ویرایش:

saalek110

Well-Known Member
کد اکشن یا جواب فرم:

PHP:
if ( $_SESSION["username"] == $user  || $_SESSION["username"] == "Admin" )   //aya khode saheb posteh
{// Auth
 if(isset($_POST['act']))
 {// if action
       $leader_post=test_input($_POST["leader_post"]);
if ( $leader_post=="yes")
       {
              $post_number=test_input($_POST["post_number"]);
              $topic_number=test_input($_POST["topic_number"]);
               $post_text=test_input($_POST["post_text"]);
               $topic_title=test_input($_POST["topic_title"]);

                    mysqli_set_charset($conn, "utf8");

     $sql = "UPDATE posts SET post='$post_text' WHERE number=$post_number";
     $result = mysqli_query($conn ,$sql);

     $sql = "UPDATE topics SET title=' $topic_title' WHERE number=$topic_number";
     $result = mysqli_query($conn ,$sql);
       }  // leader_post=yes
if ( $leader_post=="no")
       {
              $post_number=test_input($_POST["post_number"]);
              $topic_number=test_input($_POST["topic_number"]);
               $post_text=test_input($_POST["post_text"]);

                    mysqli_set_charset($conn, "utf8");

     $sql = "UPDATE posts SET post='$post_text' WHERE number=$post_number";
     $result = mysqli_query($conn ,$sql);

       }  // leader_post=yes


 echo"<div id='msg'>";

echo"<a href='http://saalek110.is-great.net/forum/topic.php?number=$topic_number'>"."return to topic"."</a>";
echo"<br>";
 $the_word=writeMsg(18) ;
 echo  $the_word;
 echo"</div>";

 }// if action
 }  // auth

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



PHP:
$_SESSION["username"] == "Admin"

شرح کد:
ابتدا لیدر پست را خوندیم تا بدونیم پست از چه نوعی است.
اگر لیدر پست برابر yes باشه ، پس عنوان تاپیک را هم به عنوان یک کار اضافه می خونیم و در دیتابیس هم عنوان تاپیک را بروز می کنیم.
اگر لیدر پست برابر no باشه ، اصلا در فرم ، قسمت عنوان تاپیک نداریم که ارسال بشه به قسمت کدهای اکشن ، پس خوندن عنوان تاپیک بی معنی است و بعدش هم آپدیت عنوان تاپیک بی معنی است.
 
آخرین ویرایش:

saalek110

Well-Known Member
تاپیک مهم ساختن:

ستون top را اضافه کردم.
با کد زیر:

PHP:
UPDATE `topics` SET `top`="no" WHERE 1

در php my admin همه ستون با no پر شد.

کد خوندن تاپیک ها این طوری شد:
PHP:
$sql = "SELECT * FROM topics WHERE forum=$forum_number AND top='yes' ORDER BY topic_time DESC";

یعنی تاپیکهایی که ستون top برابر با yes دارند ، اول خونده میشن. یعنی تاپیکهای سنجاق شده به بالا یا مهم شده.
 
آخرین ویرایش:

saalek110

Well-Known Member
PHP:
mysqli_set_charset($conn, "utf8");

$sql = "SELECT * FROM topics WHERE forum=$forum_number AND top='yes' ORDER BY topic_time DESC";
  $result = mysqli_query($conn ,$sql);
   include"forum_parts/show_topics.php";

$sql = "SELECT * FROM topics WHERE forum=$forum_number AND top='no' ORDER BY topic_time DESC";
  $result = mysqli_query($conn ,$sql);
   include"forum_parts/show_topics.php";

در کد بالا ، اول تاپیکهای مهم چاپ می شوند و بعد تاپیکهای معمولی چاپ می شوند.
اون قسمت چاپ چون تکراری بود منتقل شد به یک فایل جدید.

show_topics.php:
PHP:
<?php
echo"<center>";
     echo"<table style=' width:100%;  background-color: #9999cc;'>";

          while($info = mysqli_fetch_array( $result ))
           {
            echo"<tr>";
           
              $topic_title=$info['title'];
            $topic_number=$info['number'];
            $topic_count=$info['count'];
             $topic_time=$info['topic-time'];
             $topic_top=$info['top'];

 echo"<td style=' width:100%;  background-color: #9999cc;'>";

                 echo"<div id='forum'>";
                   //echo $name;
echo"<a href='http://saalek110.is-great.net/forum/topic.php?number=$topic_number'>".$topic_title."</a>";
 
if ( $topic_top=="yes") echo"top";
              echo"<div id='count'>";   // div inside div
                 echo   $topic_count;
                  echo"</div>";
echo"</div>";
                    echo"</td>";
                  echo"</tr>";
                                   }
         echo"</table>";
               echo"</center>";


?>

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

Screenshot_2.png

Screenshot_3.png
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا