1. Соблюдайте Правила форума и проявляйте уважение к другим участникам беседы.

Info [Как это сделать?] Мануал для новичков

Тема в разделе 'Кодинг/Собственные решения', создана пользователем Synth (LM), 2 май 2012.

  1. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Если вы хотите что-то изменить в боте, но не знаете с чего начать, прочтите это.

    В общем когда я еще не знал код бота, но мне нужно было что-то (причем с теорией тоже было не совсем хорошо, благо сейчас научили), я следовал своему алгоритму нахождения мне нужной плюшки (сначала покажу формальное выполнение):
    1. Детальнее понять что из себя представляет нужный объект.
    2. Найти в коде его конечный результат, который виден вам (то ли это команда, то ли это занос статы в базу, то ли еще что нибудь).
    3. Начать изучать кусок кода, где находится конечный или промежуточный результат, в зависимости от того, что ищем, искать "ступеньки" ведущие к определению какой либо функции или ее объявлению.
    4. Дойдя до нужного истока функции, редактировать по своему желанию.

    Например с этим "Время в банах":
    1. У нас есть зацепка - это занос времени к забаненному игроку, это 100% использование локального времени (можно поискать по "time") и это что-то связанное с базой, точнее с ее вносом.
    2. Ищем в коде промежуточный результат: CTRL+F >> "ban" (ищем описание команды !ban).
    3. Изучаем весь кусок команды !bans: нашли строку, где инфо о забаненном добавляется в вектор
      m_PairedBanAdds.push_back( PairedBanAdd( Usr, m_GHost->m_DB->ThreadedBanAdd( m_Server, Victim, string( ), string( ), User, Reason, BanTime, 0 ) ) );

      Из этого нужно понять, что если где-то добавляется в вектор, значит где-то в другом месте этот вектор очищается, но прежде прочитав все значения из него. Значит ищем где этот вектор очищается (чаще всего выше очистки и есть "парсинг" вектора) - CTRL+F >> "m_PairedBanAdds.erase" (нужно знать что делает каждая функция - гугл т.с. в помощь).
      Нашли строку
      i = m_PairedBanAdds.erase( i );

      Смотрим на начало куска - что мы видим:
      for( vector<PairedBanAdd> :: iterator i = m_PairedBanAdds.begin( ); i != m_PairedBanAdds.end( ); )

      Так и есть - тут у нас и происходит "парсинг" всего вектора. Мы дошли до 4 пункта.
    4. Быстренько пробежавшись по маленькому кусочку кода, в глаза бросается "Date" и "time", смотрим где эти слова "превращаются" в нужные нам цифры:
      struct tm * timeinfo;
      				char buffer [80];
      				time_t Now = time( NULL );
      				timeinfo = localtime( &Now );
      				strftime (buffer,80,"%d-%m-%Y",timeinfo);  
      				sTDate = buffer;
      				if (i->second->GetExpireDayTime()>0)
      				{
      					Now += 3600*24*i->second->GetExpireDayTime();
      					timeinfo = localtime( &Now );
      					strftime (buffer,80,"%d-%m-%Y",timeinfo);  
      					sDate = buffer;
      				}

      Опа, попадается что-то напоминающее Days, Mounth, Year:
      strftime (buffer,80,"%d-%m-%Y",timeinfo);

      Отлично, осталось дописать секунды и минуты - идем в гугл, ищем подробное использование "strftime": "strftime c++". Наверно по первой же ссылке вам расскажут какие переменные стоит использовать, чтобы добавить секунды и минуты.
      Я попробую на хардкор и на честность и сделаю так:
      strftime (buffer,80,"%d-%m-%Y %M:%S",timeinfo);

      Готово. Теперь секунды и минуты будут отображаться.

    PS: Делал всё по алгоритму, честно сказать не ожидал что всё сразу получится, но увы, я ошибся и получиться должно на 99%.
    silenser, Suicider и Starkjkee нравится это.
  2. silenser Давний приятель

    Сообщения:
    240
    Спасибы:
    3
    Сборка бота GHost:
    Ghost one be sisiee
    Дата начала использования бота:
    01.01.2012
    круто спс сс