Advertisement
Guest User

Tag bot

a guest
May 14th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.84 KB | None | 0 0
  1. #include "VP.h"
  2.  
  3. #include <ctime>
  4. #include <iostream>
  5. #include <list>
  6. #include <map>
  7. #include <sstream>
  8. #include <string>
  9.  
  10. using namespace std;
  11.  
  12. const char* UNIVERSE_HOST = "universe.virtualparadise.org";
  13. int UNIVERSE_PORT = 57000;
  14.  
  15. struct User {
  16.   int mSession;
  17.   int mUserId;
  18.   string mName;
  19.   float mX;
  20.   float mY;
  21.   float mZ;
  22.  
  23.   User() {}
  24.  
  25.   User(int session, int userId, string name, float x, float y, float z) :
  26.       mSession(session), mUserId(userId), mName(name), mX(x), mY(y), mZ(z) {
  27.   }
  28. };
  29.  
  30. class TagBot {
  31.   public:
  32.     TagBot(VPInstance instance) : mInstance(instance), mItUserId(-1) {
  33.     }
  34.  
  35.     void onAvatarAdd(const string& name, int session, int userId,
  36.         float x, float y, float z) {
  37.       User u(session, userId, name, x, y, z);
  38.       mUsersBySession[session] = u;
  39.       mUsersById[userId] = u;
  40.       // Make this poor sap the first it.
  41.       if (mItUserId < 0) {
  42.         changeIt(u);
  43.       }
  44.     }
  45.  
  46.     void onAvatarDelete(int session) {
  47.       mUsersBySession.erase(session);
  48.     }
  49.  
  50.     void onAvatarChange(string name, int session, float x, float y, float z) {
  51.       User u = mUsersBySession[session];
  52.       u.mName = name;
  53.       u.mX = x;
  54.       u.mY = y;
  55.       u.mZ = z;
  56.       mUsersBySession[session] = u;
  57.       mUsersById[u.mUserId] = u;
  58.     }
  59.  
  60.     void onAvatarClick(int clickerSession, int clickeeSession) {
  61.       User& a = mUsersBySession[clickerSession];
  62.       User& b = mUsersBySession[clickeeSession];
  63.       if (a.mUserId != mItUserId) {
  64.         return;
  65.       }
  66.  
  67.       float distSq = ((a.mX - b.mX) * (a.mX - b.mX)) +
  68.           ((a.mY - b.mY) * (a.mY - b.mY)) +
  69.           ((a.mZ - b.mZ) * (a.mZ - b.mZ));
  70.       cout << a.mName << " clicked " << b.mName
  71.           << " at a sq. distance of " << distSq << endl;
  72.  
  73.       if (b.mUserId == mItTaggedByUserId) {
  74.         vp_console_message(mInstance, clickerSession, "Smoke'n'tagger",
  75.           "You can't tag the person who tagged you!", 0, 255, 0, 0);
  76.         return;
  77.       }
  78.  
  79.       if (distSq < 4.0) {
  80.         changeIt(b);
  81.         return;
  82.       }
  83.  
  84.       if (distSq < 10.0) {
  85.         string msg = string("Watch out! ") + a.mName + " tried to tag you, ";
  86.         msg += "but they were too far away.";
  87.         vp_console_message(mInstance, clickeeSession, "Smoke'n'tagger",
  88.           msg.c_str(), 0, 0, 200, 50);
  89.       }
  90.       vp_console_message(mInstance, clickerSession, "Smoke'n'tagger",
  91.           "You were too far away!", 0, 255, 0, 0);
  92.     }
  93.  
  94.     void onChat(int session, string name, string message) {
  95.       if (message == "!whosit") {
  96.         announceIt();
  97.       }
  98.       if (message == "!tagme") {
  99.         changeIt(mUsersBySession[session]);
  100.       }
  101.     }
  102.  
  103.     void onUserAttributes(int userId, string name) {
  104.       if (mItUserId == userId) {
  105.         User u = mUsersById[mItUserId];
  106.         u.mName = name;
  107.         mUsersById[mItUserId] = u;
  108.       }
  109.     }
  110.  
  111.     void announceIt() {
  112.       string msg = mUsersById[mItUserId].mName + " has been IT for " +
  113.         formatTimeSince(mItSetTime, true);
  114.       vp_say(mInstance, msg.c_str());
  115.     }
  116.  
  117.     void fetchItData() {
  118.       vp_user_attributes_by_id(mInstance, mItUserId);
  119.     }
  120.  
  121.   private:
  122.     VPInstance mInstance;
  123.  
  124.     int mItUserId;
  125.     int mItTaggedByUserId;
  126.     time_t mItSetTime;
  127.  
  128.     map<int, User> mUsersBySession;
  129.     map<int, User> mUsersById;
  130.  
  131.     void changeIt(User& newIt) {
  132.       mItTaggedByUserId = mItUserId;
  133.       mItUserId = newIt.mUserId;
  134.       string msg;
  135.  
  136.       if (mItTaggedByUserId >= 0) {
  137.         string oldItName = mUsersById[mItTaggedByUserId].mName;
  138.         string timeStr = formatTimeSince(mItSetTime, false);
  139.         msg = oldItName + " tagged " + newIt.mName + "; IT for " + timeStr +
  140.           "\n" + newIt.mName + " is now IT!";
  141.         cout << "Old it: " << oldItName << endl;
  142.       } else {
  143.         msg = newIt.mName + " is IT!";
  144.       }
  145.       cout << "New it: " << newIt.mName;
  146.       vp_say(mInstance, msg.c_str());
  147.  
  148.       mItUserId = newIt.mUserId;
  149.       mItSetTime = time(0);
  150.     }
  151.  
  152.     string formatTimeSince(time_t oldTime, bool counting) {
  153.       time_t now = time(0);
  154.       int deltaSeconds = (int) (now - oldTime);
  155.       return formatDeltaFromDays(deltaSeconds) +
  156.         (counting ? "and counting!" : "but no more!");
  157.     }
  158.  
  159.     string formatDeltaFromDays(int seconds) {
  160.       const int secondsPerDay = 60 * 60 * 24;
  161.       int days = seconds / secondsPerDay;
  162.       seconds = seconds - (days * secondsPerDay);
  163.       if (days > 0) {
  164.         stringstream s;
  165.         s << days << " days, " << formatDeltaFromHours(seconds);
  166.         return s.str();
  167.       }
  168.       return formatDeltaFromHours(seconds);
  169.     }
  170.  
  171.     string formatDeltaFromHours(int seconds) {
  172.       const int secondsPerHour = 60 * 60;
  173.       int hours = seconds / secondsPerHour;
  174.       seconds = seconds - (hours * secondsPerHour);
  175.       if (hours > 0) {
  176.         stringstream s;
  177.         s << hours << " hours, " << formatDeltaFromMinutes(seconds);
  178.         return s.str();
  179.       }
  180.       return formatDeltaFromMinutes(seconds);
  181.     }
  182.  
  183.     string formatDeltaFromMinutes(int seconds) {
  184.       const int secondsPerMinute = 60;
  185.       int minutes = seconds / secondsPerMinute;
  186.       seconds = seconds - (minutes * secondsPerMinute);
  187.       if (minutes > 0) {
  188.         stringstream s;
  189.         s << minutes << " minutes, " << formatDeltaFromSeconds(seconds);
  190.         return s.str();
  191.       }
  192.       return formatDeltaFromSeconds(seconds);
  193.     }
  194.  
  195.     string formatDeltaFromSeconds(int seconds) {
  196.       stringstream s;
  197.       s << seconds << " seconds, ";
  198.       return s.str();
  199.     }
  200. };
  201.  
  202. TagBot *BOT;
  203.  
  204. void event_avatar_add(VPInstance instance) {
  205.   string avatarName(vp_string(instance, VP_AVATAR_NAME));
  206.   int avatarSession = vp_int(instance, VP_AVATAR_SESSION);
  207.   int userId = vp_int(instance, VP_USER_ID);
  208.   float avatarX = vp_float(instance, VP_AVATAR_X);
  209.   float avatarY = vp_float(instance, VP_AVATAR_Y);
  210.   float avatarZ = vp_float(instance, VP_AVATAR_Z);
  211.   BOT->onAvatarAdd(avatarName, avatarSession, userId,
  212.     avatarX, avatarY, avatarZ);
  213. }
  214.  
  215. void event_chat(VPInstance instance) {
  216.   int session = vp_int(instance, VP_AVATAR_SESSION);
  217.   string name = vp_string(instance, VP_AVATAR_NAME);
  218.   string message = vp_string(instance, VP_CHAT_MESSAGE);
  219.   BOT->onChat(session, name, message);
  220. }
  221.  
  222. void event_avatar_delete(VPInstance instance) {
  223.   int session = vp_int(instance, VP_AVATAR_SESSION);
  224.   BOT->onAvatarDelete(session);
  225. }
  226.  
  227. void event_avatar_change(VPInstance instance) {
  228.   string avatarName(vp_string(instance, VP_AVATAR_NAME));
  229.   int avatarSession = vp_int(instance, VP_AVATAR_SESSION);
  230.   float avatarX = vp_float(instance, VP_AVATAR_X);
  231.   float avatarY = vp_float(instance, VP_AVATAR_Y);
  232.   float avatarZ = vp_float(instance, VP_AVATAR_Z);
  233.   BOT->onAvatarChange(avatarName, avatarSession, avatarX, avatarY, avatarZ);
  234. }
  235.  
  236. void event_avatar_click(VPInstance instance) {
  237.   int clickerSession = vp_int(instance, VP_AVATAR_SESSION);
  238.   int clickeeSession = vp_int(instance, VP_CLICKED_SESSION);
  239.   BOT->onAvatarClick(clickerSession, clickeeSession);
  240. }
  241.  
  242. void event_user_attributes(VPInstance instance) {
  243.   int userId = vp_int(instance, VP_USER_ID);
  244.   string name = vp_string(instance, VP_USER_NAME);
  245.   BOT->onUserAttributes(userId, name);
  246. }
  247.  
  248. int main(int argc, const char* argv[]) {
  249.   int rc;
  250.   if (rc = vp_init()) {
  251.     cout << "Unable to initialize API: " << rc << endl;
  252.     return -1;
  253.   }
  254.  
  255.   VPInstance instance = vp_create();
  256.  
  257.   if (rc = vp_connect_universe(instance, UNIVERSE_HOST, UNIVERSE_PORT)) {
  258.     cout << "Couldn't connect to universe: " << rc << endl;
  259.     return -1;
  260.   }
  261.  
  262.   // Sorry guys, old-school.
  263.   string username, password, world;
  264.   cout << "Username: ";
  265.   cin >> username;
  266.   cout << "Password: ";
  267.   cin >> password;
  268.   cout << "World: ";
  269.   cin >> world;
  270.   if (rc = vp_login(instance, username.c_str(), password.c_str(), "Smoke'n'tagger")) {
  271.     cout << "Couldn't login: " << rc << endl;
  272.     return -1;
  273.   }
  274.  
  275.   if (rc = vp_enter(instance, world.c_str())) {
  276.     cout << "Couldn't enter world: " << rc << endl;
  277.     return -1;
  278.   }
  279.  
  280.   vp_event_set(instance, VP_EVENT_AVATAR_ADD, event_avatar_add);
  281.   vp_event_set(instance, VP_EVENT_CHAT, event_chat);
  282.   vp_event_set(instance, VP_EVENT_AVATAR_DELETE, event_avatar_delete);
  283.   vp_event_set(instance, VP_EVENT_AVATAR_CHANGE, event_avatar_change);
  284.   vp_event_set(instance, VP_EVENT_AVATAR_CLICK, event_avatar_click);
  285.   vp_event_set(instance, VP_EVENT_USER_ATTRIBUTES, event_user_attributes);
  286.  
  287.   vp_state_change(instance);
  288.  
  289.   BOT = new TagBot(instance);
  290.  
  291.   time_t lastRollCall = time_t(0);
  292.  
  293.   while (!vp_wait(instance, 10)) {
  294.     time_t now = time_t(0);
  295.     int difference = (int)now - lastRollCall;
  296.     if (difference > 60 * 60 * 24) {
  297.       BOT->announceIt();
  298.       // Make sure our 'it' isn't changing their name to get out of the shame.
  299.       BOT->fetchItData();
  300.     }
  301.   }
  302. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement