diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index eccd2190793..deb2ae8d7f9 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -478,3 +478,20 @@ CREATE TABLE `erro_notes` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `memo`
+--
+
+DROP TABLE IF EXISTS `erro_memo`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `erro_memo` (
+ `ckey` varchar(32) NOT NULL,
+ `memotext` text NOT NULL,
+ `timestamp` datetime NOT NULL,
+ `last_editor` varchar(32),
+ `edits` text,
+ PRIMARY KEY (`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm
index 4a5f2eac73a..03fc3767b8e 100644
--- a/code/modules/admin/admin_memo.dm
+++ b/code/modules/admin/admin_memo.dm
@@ -1,55 +1,134 @@
-#define MEMOFILE "data/memo.sav" //where the memos are saved
-#define ENABLE_MEMOS 1 //using a define because screw making a config variable for it. This is more efficient and purty.
-
-//switch verb so we don't spam up the verb lists with like, 3 verbs for this feature.
-/client/proc/admin_memo(task in list("write","show","delete"))
+/client/proc/admin_memo()
set name = "Memo"
set category = "Server"
- if(!ENABLE_MEMOS) return
- if(!check_rights(0)) return
+ if(!check_rights(R_SERVER))
+ return
+ if(!dbcon.IsConnected())
+ src << "Failed to establish database connection."
+ return
+ var/memotask = input(usr,"Choose task.","Memo") in list("Show","Write","Edit","Remove")
+ if(!memotask)
+ return
+ admin_memo_output(memotask)
+
+/client/proc/admin_memo_output(task, checkrights = 1)
+ if(checkrights && !check_rights(R_SERVER))
+ return
+ if(!task)
+ return
+ if(!dbcon.IsConnected())
+ src << "Failed to establish database connection."
+ return
+ var/sql_ckey = sanitizeSQL(src.ckey)
switch(task)
- if("write") admin_memo_write()
- if("show") admin_memo_show()
- if("delete") admin_memo_delete()
-
-//write a message
-/client/proc/admin_memo_write()
- var/savefile/F = new(MEMOFILE)
- if(F)
- var/memo = input(src,"Type your memo\n(Leaving it blank will delete your current memo):","Write Memo",null) as null|message
- switch(memo)
- if(null)
+ if("Write")
+ var/DBQuery/query_memocheck = dbcon.NewQuery("SELECT ckey FROM [format_table_name("memo")] WHERE ckey = '[sql_ckey]'")
+ if(!query_memocheck.Execute())
+ var/err = query_memocheck.ErrorMsg()
+ log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
return
- if("")
- F.dir.Remove(ckey)
- src << "Memo removed"
+ if(query_memocheck.NextRow())
+ src << "You already have set a memo."
return
- if( findtext(memo,"