Jump to content

[Patch] Auto Announcer(With Next ID)


Recommended Posts

  • Replies 64
  • Created
  • Last Reply

Top Posters In This Topic

  • 38 years later...

Hey,

i've modified the announcer script i've found for mangos to allow a next id to be specified this will be the id of the next message that will be announced.

Here's the patch(It's cut from my own source patch that had some other stuff in it so might not work):

diff --git a/src/game/Language.h b/src/game/Language.h
index 0c20968..6b27f6e 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -723,6 +723,8 @@ enum MangosStrings

    // FREE IDS                           1200-9999

+    // Broadcaster
+    LANG_AUTO_BROADCAST                 = 1200,
    // Use for not-in-offcial-sources patches
    //                                    10000-10999

diff --git a/src/game/World.cpp b/src/game/World.cpp
index 6fa9a30..5547766 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -58,6 +58,7 @@
#include "WaypointManager.h"
#include "GMTicketMgr.h"
#include "Util.h"
+#include "Language.h"

INSTANTIATE_SINGLETON_1( World );

@@ -1304,8 +1305,10 @@ void World::SetInitialWorldSettings()
    sprintf( isoDate, "%04d-%02d-%02d %02d:%02d:%02d",
        local.tm_year+1900, local.tm_mon+1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);

-    WorldDatabase.PExecute("INSERT INTO uptime (startstring, starttime, uptime) VALUES('%s', " I64FMTD ", 0)",
-        isoDate, uint64(m_startTime));
+    WorldDatabase.PExecute("INSERT INTO uptime (startstring, starttime, uptime) VALUES('%s', " I64FMTD ", 0)", isoDate, uint64(m_startTime));
+
+    static uint32 abtimer = 0;
+    abtimer = sConfig.GetIntDefault("AutoBroadcast.Timer", 60000);

    m_timers[WUPDATE_OBJECTS].SetInterval(0);
    m_timers[WUPDATE_SESSIONS].SetInterval(0);
@@ -1314,6 +1317,7 @@ void World::SetInitialWorldSettings()
    m_timers[WUPDATE_UPTIME].SetInterval(m_configs[CONFIG_UPTIME_UPDATE]*MINUTE*1000);
                                                            //Update "uptime" table based on configuration entry in minutes.
    m_timers[WUPDATE_CORPSES].SetInterval(20*MINUTE*1000);  //erase corpses every 20 minutes
+    m_timers[WUPDATE_AUTOBROADCAST].SetInterval(abtimer);

    //to set mailtimer to return mails every day between 4 and 5 am
    //mailtimer is increased when updating auctions
@@ -1552,6 +1556,17 @@ void World::Update(time_t diff)
        m_timers[WUPDATE_EVENTS].Reset();
    }

+    static uint32 autobroadcaston = 0;
+    autobroadcaston = sConfig.GetIntDefault("AutoBroadcast.On", 0);
+    if(autobroadcaston == 1)
+    {
+        if (m_timers[WUPDATE_AUTOBROADCAST].Passed())
+        {
+            m_timers[WUPDATE_AUTOBROADCAST].Reset();
+            SendBroadcast();
+        }
+    }
+
    /// [/list]
    ///- Move all creatures with "delayed move" and remove and delete all objects with "delayed remove"
    MapManager::Instance().DoDelayedMovesAndRemoves();
@@ -2629,6 +2644,56 @@ void World::ProcessCliCommands()
    zprint("mangos>");
}

+void World::SendBroadcast()
+{
+    std::string msg;
+    static int nextid;
+
+    QueryResult *result;
+    if(nextid != 0)
+    {
+        result = WorldDatabase.PQuery("SELECT `text`, `next` FROM `autobroadcast` WHERE `id` = %u", nextid);
+    }
+    else
+    {
+        result = WorldDatabase.PQuery("SELECT `text`, `next` FROM `autobroadcast` ORDER BY RAND() LIMIT 1");
+    }
+
+    if(!result)
+        return;
+
+    nextid = result->Fetch()[1].GetUInt8();
+    msg = result->Fetch()[0].GetString();
+    delete result;
+
+    static uint32 abcenter = 0;
+    abcenter = sConfig.GetIntDefault("AutoBroadcast.Center", 0);
+    if(abcenter == 0)
+    {
+        sWorld.SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
+
+        sLog.outString("AutoBroadcast: '%s'",msg.c_str());
+    }
+    if(abcenter == 1)
+    {
+        WorldPacket data(SMSG_NOTIFICATION, (msg.size()+1));
+        data << msg;
+        sWorld.SendGlobalMessage(&data);
+
+        sLog.outString("AutoBroadcast: '%s'",msg.c_str());
+    }
+    if(abcenter == 2)
+    {
+        sWorld.SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
+
+        WorldPacket data(SMSG_NOTIFICATION, (msg.size()+1));
+        data << msg;
+        sWorld.SendGlobalMessage(&data);
+
+        sLog.outString("AutoBroadcast: '%s'",msg.c_str());
+    }
+}
+
void World::InitResultQueue()
{
    m_resultQueue = new SqlResultQueue;
diff --git a/src/game/World.h b/src/game/World.h
index 57167bf..5f70d80 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -66,7 +66,8 @@ enum WorldTimers
    WUPDATE_UPTIME      = 4,
    WUPDATE_CORPSES     = 5,
    WUPDATE_EVENTS      = 6,
-    WUPDATE_COUNT       = 7
+    WUPDATE_AUTOBROADCAST = 7,
+    WUPDATE_COUNT         = 8
};

/// Configuration elements
@@ -342,6 +343,7 @@ class World

        WorldSession* FindSession(uint32 id) const;
        void AddSession(WorldSession *s);
+        void SendBroadcast();
        bool RemoveSession(uint32 id);
        /// Get the number of current active sessions
        void UpdateMaxSessionCounters();

The SQL:

CREATE TABLE IF NOT EXISTS `autobroadcast` (
 `id` int(11) NOT NULL auto_increment,
 `text` longtext NOT NULL,
 `next` int(11) NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
(1200, '|cffffcc00[server]: |cff00ff00%s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

Add the following to your config:

###################################################################################################################
# AUTO BROADCAST
#
#    AutoBroadcast.On
#        Enable auto broadcast
#        Default: 0 - off
#                 1 - on
#
#    AutoBroadcast.Center
#        Display method
#        Default: 0 - announce
#                 1 - notify
#                 2 - both
#
#    AutoBroadcast.Timer
#        Timer for auto broadcast
#
###################################################################################################################

AutoBroadcast.On = 1
AutoBroadcast.Center = 2
AutoBroadcast.Timer = 30000

Enjoy, Xeross

Link to comment
Share on other sites

compile error:

World.cpp: In member function ‘void World::LoadConfigSettings(bool)’:
World.cpp:850: warning: cannot pass objects of non-POD type ‘struct std::string’ through ‘...’; call will abort at runtime
World.cpp: In member function ‘void World::SendBroadcast()’:
World.cpp:2416: error: no matching function for call to ‘World::SendWorldText(MangosStrings, const char*)’
World.cpp:2025: note: candidates are: void World::SendWorldText(const char*, WorldSession*)
World.cpp:2430: error: no matching function for call to ‘World::SendWorldText(MangosStrings, const char*)’
World.cpp:2025: note: candidates are: void World::SendWorldText(const char*, WorldSession*)

Link to comment
Share on other sites

  • 2 months later...

i think this patch has to be redone:

(or you just have to explain me some parts)

+    static uint32 abtimer = 0;
+    abtimer = sConfig.GetIntDefault("AutoBroadcast.Timer", 60000);

i don't see the use for static there,

also it will be better to save it in a variable like all other configs

+    static int nextid;
+
+    QueryResult *result;
+    if(nextid != 0)

after declaration without initalisation this variable can have randome-garbage in it, which can cause unexpected results

+    nextid = result->Fetch()[1].GetUInt8();
+    msg = result->Fetch()[0].GetString();

i think this is wrong and must be:

Field *fields = result->Fetch();
nextid  = fields[1].GetUInt32();
msg = fields[0].GetString();

hope i could help to improve your code :)

Link to comment
Share on other sites

Hello, please anybody can update patch ?

Beacause the source have changed ....

-    WorldDatabase.PExecute("INSERT INTO uptime (startstring, starttime, uptime) VALUES('%s', " I64FMTD ", 0)",
-        isoDate, uint64(m_startTime));
+    WorldDatabase.PExecute("INSERT INTO uptime (startstring, starttime, uptime) VALUES('%s', " I64FMTD ", 0)", isoDate, uint64(m_startTime));
+
+    static uint32 abtimer = 0;
+    abtimer = sConfig.GetIntDefault("AutoBroadcast.Timer", 60000);

For exemple ...

Thanks

:)

Link to comment
Share on other sites

diff --git a/src/game/World.cpp b/src/game/World.cpp
index abf002d..daabc68 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1386,8 +1386,10 @@ void World::SetInitialWorldSettings()
    sprintf( isoDate, "%04d-%02d-%02d %02d:%02d:%02d",
        local.tm_year+1900, local.tm_mon+1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);

-    loginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, startstring, uptime) VALUES('%u', " I64FMTD ", '%s', 0)",
-        realmID, uint64(m_startTime), isoDate);
+    loginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, startstring, uptime) VALUES('%u', " I64FMTD ", '%s', 0)", realmID, uint64(m_startTime), isoDate);
+
+    static uint32 abtimer = 0;
+    abtimer = sConfig.GetIntDefault("AutoBroadcast.Timer", 60000);

    m_timers[WUPDATE_OBJECTS].SetInterval(0);
    m_timers[WUPDATE_SESSIONS].SetInterval(0);
@@ -1397,6 +1399,7 @@ void World::SetInitialWorldSettings()
                                                            //Update "uptime" table based on configuration entry in minutes.
    m_timers[WUPDATE_CORPSES].SetInterval(20*MINUTE*IN_MILISECONDS);
                                                            //erase corpses every 20 minutes
+    m_timers[WUPDATE_AUTOBROADCAST].SetInterval(abtimer);

    //to set mailtimer to return mails every day between 4 and 5 am
    //mailtimer is increased when updating auctions
@@ -1440,6 +1443,8 @@ void World::SetInitialWorldSettings()
    uint32 nextGameEvent = gameeventmgr.Initialize();
    m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent);    //depend on next event

+    sLog.outString("Starting Autobroadcast system..." );
+
    sLog.outString( "WORLD: World initialized" );
}

@@ -1598,6 +1603,17 @@ void World::Update(uint32 diff)
        m_timers[WUPDATE_EVENTS].Reset();
    }

+    static uint32 autobroadcaston = 0;
+    autobroadcaston = sConfig.GetIntDefault("AutoBroadcast.On", 0);
+    if(autobroadcaston == 1)
+    {
+        if (m_timers[WUPDATE_AUTOBROADCAST].Passed())
+        {
+            m_timers[WUPDATE_AUTOBROADCAST].Reset();
+            SendBroadcast();
+        }
+    }
+
    /// [/list]
    ///- Move all creatures with "delayed move" and remove and delete all objects with "delayed remove"
    MapManager::Instance().DoDelayedMovesAndRemoves();
@@ -2762,6 +2778,56 @@ void World::ProcessCliCommands()
    zprint("mangos>");
}

+void World::SendBroadcast()
+{
+    std::string msg;
+    static int nextid;
+
+    QueryResult *result;
+    if(nextid != 0)
+    {
+        result = loginDatabase.PQuery("SELECT `text`, `next` FROM `autobroadcast` WHERE `id` = %u", nextid);
+    }
+    else
+    {
+        result = loginDatabase.PQuery("SELECT `text`, `next` FROM `autobroadcast` ORDER BY RAND() LIMIT 1");
+    }
+
+    if(!result)
+        return;
+
+    Field *fields = result->Fetch();
+    nextid  = fields[1].GetUInt32();
+    msg = fields[0].GetString();
+    delete result;
+
+    static uint32 abcenter = 0;
+    abcenter = sConfig.GetIntDefault("AutoBroadcast.Center", 0);
+    if(abcenter == 0)
+    {
+        sWorld.SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
+
+        sLog.outString("AutoBroadcast: '%s'",msg.c_str());
+    }
+    if(abcenter == 1)
+    {
+        WorldPacket data(SMSG_NOTIFICATION, (msg.size()+1));
+        data << msg;
+        sWorld.SendGlobalMessage(&data);
+
+        sLog.outString("AutoBroadcast: '%s'",msg.c_str());
+    }
+    if(abcenter == 2)
+    {
+        sWorld.SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
+
+        WorldPacket data(SMSG_NOTIFICATION, (msg.size()+1));
+        data << msg;
+        sWorld.SendGlobalMessage(&data);
+
+        sLog.outString("AutoBroadcast: '%s'",msg.c_str());
+    }
+}
+
void World::InitResultQueue()
{
    m_resultQueue = new SqlResultQueue;
diff --git a/src/game/World.h b/src/game/World.h
index 3e4b24c..6b41cd3 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -66,7 +66,8 @@ enum WorldTimers
    WUPDATE_UPTIME      = 4,
    WUPDATE_CORPSES     = 5,
    WUPDATE_EVENTS      = 6,
-    WUPDATE_COUNT       = 7
+    WUPDATE_AUTOBROADCAST = 7,
+    WUPDATE_COUNT         = 8
};

/// Configuration elements
@@ -360,6 +361,7 @@ class World

        WorldSession* FindSession(uint32 id) const;
        void AddSession(WorldSession *s);
+        void SendBroadcast();
        bool RemoveSession(uint32 id);
        /// Get the number of current active sessions
        void UpdateMaxSessionCounters();

have fun!

PS: autobroadcast table moved from world to realmd db :)

Link to comment
Share on other sites

  • 2 weeks later...

here is updated patch

diff --git a/src/game/World.cpp b/src/game/World.cpp
index abf002d..daabc68 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1367,8 +1367,10 @@ void World::SetInitialWorldSettings()
    sprintf( isoDate, "%04d-%02d-%02d %02d:%02d:%02d",
        local.tm_year+1900, local.tm_mon+1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);

-    loginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, startstring, uptime) VALUES('%u', " I64FMTD ", '%s', 0)",
-        realmID, uint64(m_startTime), isoDate);
+    loginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, startstring, uptime) VALUES('%u', " I64FMTD ", '%s', 0)", realmID, uint64(m_startTime), isoDate);
+
+    static uint32 abtimer = 0;
+    abtimer = sConfig.GetIntDefault("AutoBroadcast.Timer", 60000);

    m_timers[WUPDATE_OBJECTS].SetInterval(0);
    m_timers[WUPDATE_SESSIONS].SetInterval(0);
@@ -1378,6 +1378,7 @@ void World::SetInitialWorldSettings()
                                                            //Update "uptime" table based on configuration entry in minutes.
    m_timers[WUPDATE_CORPSES].SetInterval(20*MINUTE*IN_MILISECONDS);
                                                            //erase corpses every 20 minutes
+    m_timers[WUPDATE_AUTOBROADCAST].SetInterval(abtimer);

    //to set mailtimer to return mails every day between 4 and 5 am
    //mailtimer is increased when updating auctions
@@ -1418,6 +1418,8 @@ void World::SetInitialWorldSettings()
    uint32 nextGameEvent = gameeventmgr.Initialize();
    m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent);    //depend on next event

+    sLog.outString("Starting Autobroadcast system..." );
+
    sLog.outString( "WORLD: World initialized" );
}

@@ -1574,6 +1574,17 @@ void World::Update(uint32 diff)
        m_timers[WUPDATE_EVENTS].Reset();
    }

+    static uint32 autobroadcaston = 0;
+    autobroadcaston = sConfig.GetIntDefault("AutoBroadcast.On", 0);
+    if(autobroadcaston == 1)
+    {
+        if (m_timers[WUPDATE_AUTOBROADCAST].Passed())
+        {
+            m_timers[WUPDATE_AUTOBROADCAST].Reset();
+            SendBroadcast();
+        }
+    }
+
    /// [/list]
    ///- Move all creatures with "delayed move" and remove and delete all objects with "delayed remove"
    MapManager::Instance().DoDelayedMovesAndRemoves();
@@ -2729,6 +2729,56 @@ void World::ProcessCliCommands()
    zprint("mangos>");
}

+void World::SendBroadcast()
+{
+    std::string msg;
+    static int nextid;
+
+    QueryResult *result;
+    if(nextid != 0)
+    {
+        result = loginDatabase.PQuery("SELECT `text`, `next` FROM `autobroadcast` WHERE `id` = %u", nextid);
+    }
+    else
+    {
+        result = loginDatabase.PQuery("SELECT `text`, `next` FROM `autobroadcast` ORDER BY RAND() LIMIT 1");
+    }
+
+    if(!result)
+        return;
+
+    Field *fields = result->Fetch();
+    nextid  = fields[1].GetUInt32();
+    msg = fields[0].GetString();
+    delete result;
+
+    static uint32 abcenter = 0;
+    abcenter = sConfig.GetIntDefault("AutoBroadcast.Center", 0);
+    if(abcenter == 0)
+    {
+        sWorld.SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
+
+        sLog.outString("AutoBroadcast: '%s'",msg.c_str());
+    }
+    if(abcenter == 1)
+    {
+        WorldPacket data(SMSG_NOTIFICATION, (msg.size()+1));
+        data << msg;
+        sWorld.SendGlobalMessage(&data);
+
+        sLog.outString("AutoBroadcast: '%s'",msg.c_str());
+    }
+    if(abcenter == 2)
+    {
+        sWorld.SendWorldText(LANG_AUTO_BROADCAST, msg.c_str());
+
+        WorldPacket data(SMSG_NOTIFICATION, (msg.size()+1));
+        data << msg;
+        sWorld.SendGlobalMessage(&data);
+
+        sLog.outString("AutoBroadcast: '%s'",msg.c_str());
+    }
+}
+
void World::InitResultQueue()
{
    m_resultQueue = new SqlResultQueue;
diff --git a/src/game/World.h b/src/game/World.h
index 3e4b24c..6b41cd3 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -76,7 +76,8 @@ enum WorldTimers
    WUPDATE_UPTIME      = 4,
    WUPDATE_CORPSES     = 5,
    WUPDATE_EVENTS      = 6,
-    WUPDATE_COUNT       = 7
+    WUPDATE_AUTOBROADCAST = 7,
+    WUPDATE_COUNT         = 8
};

/// Configuration elements
@@ -366,6 +366,7 @@ class World

        WorldSession* FindSession(uint32 id) const;
        void AddSession(WorldSession *s);
+        void SendBroadcast();
        bool RemoveSession(uint32 id);
        /// Get the number of current active sessions
        void UpdateMaxSessionCounters();
diff --git a/src/mangosd.conf.dist b/src/mangosd/mangosd.conf.dist
index 3e4b24c..6b41cd3 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -1250,6 +1250,29 @@ Network.OutUBuff = 65536
Network.TcpNodelay = 1

 ###################################################################################################################
+#     --AUTO BROADCAST--
+#
+#    AutoBroadcast.On
+#        Enable auto broadcast
+#    Default: 0 - off
+#            1 - on
+#
+#    AutoBroadcast.Center
+#        Display method
+#        Default: 0 - announce
+#                 1 - notify
+#                 2 - both
+#
+#    AutoBroadcast.Timer
+#        Timer for auto broadcast
+#
+###################################################################################################################
+
+AutoBroadcast.On = 1
+AutoBroadcast.Center = 2
+AutoBroadcast.Timer = 30000
+
+###################################################################################################################
# CONSOLE AND REMOTE ACCESS
#
#    Console.Enable
diff --git a/src/game/Language.h b/src/game/Language.h
index 0c20968..6b27f6e 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -723,6 +723,8 @@ enum MangosStrings

    // FREE IDS                           1300-9999

+    // Broadcaster
+    LANG_AUTO_BROADCAST                 = 1300,
    // Use for not-in-offcial-sources patches
    //                                    10000-10999

the sql (execute on realmd DB]

CREATE TABLE IF NOT EXISTS `autobroadcast` (
 `id` int(11) NOT NULL auto_increment,
 `text` longtext NOT NULL,
 `next` int(11) NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

the sql (execute on mangos DB]

INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
(1300, '|cffffcc00[server]: |cff00ff00%s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

Notice: not tested.

Link to comment
Share on other sites

You forgoth

diff --git a/src/game/Language.h b/src/game/Language.h

index 0c20968..6b27f6e 100644

--- a/src/game/Language.h

+++ b/src/game/Language.h

@@ -723,6 +723,8 @@ enum MangosStrings

// FREE IDS 1300-9999

+ // Broadcaster

+ LANG_AUTO_BROADCAST = 1300,

// Use for not-in-offcial-sources patches

// 10000-10999

and a SQL for mangos db

INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES

(1300, '|cffffcc00[server]: |cff00ff00%s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

I edited this becose id 1200 isnt free so i set it to 1300

Link to comment
Share on other sites

  • 2 months later...

still does not work, try to apply the patch comes out:

patch:13: trailing whitespace.
static uint32 abtimer = 0;

patch:14: trailing whitespace.
abtimer = sConfig.GetInDefault<"AutoBroadcast.Timer", 60000>;

patch:22: trailing whitespace.
m_timers[WUPADTE_AUTOBROADCAST].SetInterval<abtimer>;
fatal: corrupt patch at line 111

:(

Link to comment
Share on other sites

Try this

git pull git://github.com/Diablox/mangos.git autobroadcast

is no work

Welcome to Git (version 1.6.0.2-preview20080923)

$ git pull git://github.com/Diablox/mangos.git autobroadcast

remote: Counting objects: 4892, done.←[K

remote: Compressing objects: 100% (1125/1125), done.←[K

remote: Total 4484 (delta 3936), reused 3862 (delta 3356)←[K

Receiving objects: 100% (4484/4484), 1.68 MiB | 38 KiB/s, done.

fatal: cannot pread pack file: No such file or directory

fatal: index-pack failed

$

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy Terms of Use