Signed-off-by: Georg <georg@lysergic.dev>
This commit is contained in:
Georg Pfuetzenreuter 2021-08-24 21:30:13 +02:00
commit 03326d7d78
Signed by: Georg
GPG Key ID: 1DAF57F49F8E8F22
15 changed files with 3047 additions and 0 deletions

11
README.md Normal file
View File

@ -0,0 +1,11 @@
### TripSit related modules for dbot - revived
This houses forks of dbot modules specific to the TripSit IRC network.
The following issues have been resolved:
- Replaced alsuti uploader with a generic, self-hosted, https (curl) endpoint for dose log uploads
### Credits
All credits go to https://github.com/reality/ - Thank you for having made dbot and these modules possible. It served countless of users well over several years - and albeit bundled with the occasional complaints and bugs, it never left its place in many, many hearts.

129
idose/idose.js Normal file
View File

@ -0,0 +1,129 @@
/**
* Module Name: idose
* Description: dose recording
*/
var moment = require('moment-timezone'),
_ = require('underscore')._,
fs = require('fs'),
exec = require('child_process').exec;
var idose = function(dbot) {
var self = this;
this.api = {
// Save new dose entry
'saveLastDose': function(user, drug, dose, callback) {
var lDose = {
'time': Date.now(),
'drug': drug,
'dose': dose
};
if(!_.has(dbot.db.idose, user) || !_.isArray(dbot.db.idose[user])) {
dbot.db.idose[user] = [];
}
dbot.db.idose[user].push(lDose);
callback(lDose);
},
// Retrieve user's last dose, by id
'getLastDose': function(user, callback) {
callback(_.last(dbot.db.idose[user.id]));
},
'alsutu': function(user, tz) { // TODO: this belongs in its own module and is generally hax, bad
tz = tz || 'Europe/London';
var out = 'drug\tdose\ttime';
_.each(dbot.db.idose[user.id], function(entry) {
out += '\n'+entry.drug+'\t'+entry.dose+'\t'+moment(entry.time).tz(tz).format('HH:mm:ss DD/MM/YYYY');
});
fs.writeFileSync('/tmp/'+user.id+'dd.txt', out);
function puts(error, stdout, stderr) {
var res = stdout.split('\n');
dbot.say(user.id.split('.')[1], user.primaryNick, 'New idose log at: ' + res);
}
exec("/bin/curl -sT "+"/tmp/"+user.id+'dd.txt '+"https://hugz.io/"+randomString(12, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), puts);
}
};
this.commands = {
'idose': function(event) {
var dose = event.params[1]
dName = event.params[2],
roa = event.params[3];
if(roa) {
roa = capitalise(roa);
}
dbot.api.tripsit.getDrug(dName, function(drug) {
if(drug) {
self.api.saveLastDose(event.rUser.id, dName, dose, function(lDose) {
dName = drug.pretty_name;
var tz = event.rProfile.timezone || 'Europe/London';
var out = 'Dosed ' + dose + ' ' + dName + ' at ' + moment(lDose.time).tz(tz).format('HH:mm:ss on DD/MM/YYYY');
if(roa) {
out += ' via ' + roa;
}
out += '.';
if(_.has(drug, 'formatted_onset')) {
if(_.has(drug.formatted_onset, roa)) {
out += ' You should start to feel effects ' + drug.formatted_onset[roa] + ' ' + (drug.formatted_onset._unit ? (drug.formatted_onset._unit + ' ') : '') + 'from now.'
} else if(_.has(drug.formatted_onset, 'value')) {
out += ' You should start to feel effects ' + drug.formatted_onset.value + ' ' + (drug.formatted_onset._unit ? (drug.formatted_onset._unit + ' ') : '') + 'from now.'
}
}
out += ' (BTW, you can run ~set upidose true to have tripbot upload an encrypted version of your dose history to you upon updates).'
event.reply(out);
if(event.rProfile.upidose === "true") {
self.api.alsutu(event.rUser, tz);
}
});
} else {
event.reply("I have not heard of that drug before mate, take a look at the list on http://drugs.tripsit.me/");
}
});
},
'lastdose': function(event) {
this.api.getLastDose(event.rUser, function(lDose) {
if(lDose) {
var tz = event.rProfile.timezone || 'Europe/London';
var out = 'You last dosed ' + lDose.dose + ' of ' + lDose.drug
+ ' ' + moment(lDose.time).toNow(true) + ' ago ('
+ moment(lDose.time).tz(tz).format('HH:mm:ss on DD/MM/YYYY')
+ ' ' + tz + ').';
event.reply(out);
} else {
event.reply('No last dose recorded');
}
});
}
}
this.onLoad = function() {
if(!dbot.db.idose) {
dbot.db.idose = {};
}
}
};
exports.fetch = function(dbot) {
return new idose(dbot);
};
function capitalise(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
function randomString(length, chars) {
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
return result;
}

1
tripsit/INSTALL Normal file
View File

@ -0,0 +1 @@
Move views/tripsit to dbot /views/tripsit

565
tripsit/api.js Normal file
View File

@ -0,0 +1,565 @@
var _ = require('underscore'),
databank = require('databank'),
async = require('async');
var api = function(dbot) {
var api = {
'getDrugCategory': function(name, callback) {
name = name.toLowerCase();
this.db.read('drug_categories', name, function(err, cat) {
callback(cat);
});
},
'getIRCFormattedDrug': function(name, property, callback) {
this.api.getDrug(name, function(drug) {
if(drug && !_.has(drug, 'err')) {
if(_.has(drug, 'links') && _.has(drug.links, 'experiences')) {
drug.properties.experiences = drug.links.experiences;
}
if(!_.isUndefined(property)) {
if(_.has(drug.properties, property)) {
var info = drug.properties[property];
// TODO: Remove magic vars and move to formatProperty API func
if(property == 'dose') {
info = info.replace(/Threshold:/gi, "\u00032Threshold\u000f:");
info = info.replace(/Light:/gi, "\u00033Light\u000f:");
info = info.replace(/Common:/gi, "\u00037Common\u000f:");
info = info.replace(/Strong:/gi, "\u00035Strong\u000f:");
info = info.replace(/Heavy:/gi, "\u00034Heavy\u000f:");
}
if(property == 'aliases') info = info.join(', ');
callback(name + ' ' + property + ': ' + info);
} else {
callback(name + ' Info: ' + _.keys(drug.properties).join(', ') + ' - http://drugs.tripsit.me/' + drug.name);
}
} else {
callback(name + ' Info: ' + _.keys(drug.properties).join(', ') + ' - http://drugs.tripsit.me/' + drug.name);
}
} else {
callback(null);
}
});
},
'getInteraction': function(drugAName, drugBName, callback) {
drugAName = drugAName.toLowerCase();
drugBName = drugBName.toLowerCase();
if(drugAName == 'ssri' || drugAName == 'snri' || drugAName == 'snris') {
drugAName = 'ssris';
} else if(drugAName == 'maoi') {
drugAName = 'maois';
}
if(drugBName == 'ssri' || drugBName == 'snri' || drugBName == 'snris') {
drugBName = 'ssris';
} else if(drugBName == 'maoi') {
drugBName = 'maois';
}
this.api.getDrug(drugAName, function(drugA) {
if(!_.has(drugA, 'err') || _.has(this.combos, drugAName)) {
this.api.getDrug(drugBName, function(drugB) {
if(!_.has(drugB, 'err') || _.has(this.combos, drugBName)) {
var safetyCategoryA = null,
safetyCategoryB = null;
if(_.has(this.combos, drugAName)) {
safetyCategoryA = drugAName;
} else if(_.has(this.combos, drugA.name)) {
safetyCategoryA = drugA.name;
} else if(drugA.name.match(/^do.$/i)) {
safetyCategoryA = 'dox';
} else if(drugA.name.match(/^2c-.$/i)) {
safetyCategoryA = '2c-x';
} else if(drugA.name.match(/^25.-nbome/i)) {
safetyCategoryA = 'nbomes';
} else if(drugA.name.match(/^5-meo-..t$/i)) {
safetyCategoryA = '5-meo-xxt';
} else if(_.include(drugA.categories, 'benzodiazepine')) {
safetyCategoryA = 'benzodiazepines';
} else if(_.include(drugA.categories, 'opioid')) {
safetyCategoryA = 'opioids';
} else if(_.include(drugB.categories, 'benzo')) {
safetyCategoryB = 'benzos';
} else if(_.include(drugA.categories, 'stimulant')) {
safetyCategoryA = 'amphetamines';
} else if(drugA.name == 'ghb' || drugA.name == 'gbl') {
safetyCategoryA = 'ghb/gbl';
}
if(_.has(this.combos, drugBName)) {
safetyCategoryB = drugBName;
} else if(_.has(this.combos, drugB.name)) {
safetyCategoryB = drugB.name;
} else if(drugB.name.match(/^do.$/i)) {
safetyCategoryB = 'dox';
} else if(drugB.name.match(/^2c-.$/i)) {
safetyCategoryB = '2c-x';
} else if(drugB.name.match(/^25.-nbome/i)) {
safetyCategoryB = 'nbomes';
} else if(drugB.name.match(/^5-meo-..t$/i)) {
safetyCategoryB = '5-meo-xxt';
} else if(_.include(drugB.categories, 'benzodiazepine')) {
safetyCategoryB = 'benzodiazepines';
} else if(_.include(drugB.categories, 'opioid')) {
safetyCategoryB = 'opioids';
} else if(_.include(drugB.categories, 'benzo')) {
safetyCategoryB = 'benzos';
} else if(_.include(drugB.categories, 'stimulant')) {
safetyCategoryB = 'amphetamines';
} else if(drugB.name == 'ghb' || drugB.name == 'gbl') {
safetyCategoryB = 'ghb/gbl';
}
if(safetyCategoryA && safetyCategoryB) {
if(safetyCategoryA != safetyCategoryB) {
var result = _.clone(this.combos[safetyCategoryA][safetyCategoryB]);
result['interactionCategoryA'] = safetyCategoryA;
result['interactionCategoryB'] = safetyCategoryB;
return callback(result);
} else {
if(safetyCategoryA == 'benzodiazepines') {
return callback({'err': true, 'code': 'ssb', 'msg': 'Drug A and B are the same safety category.'});
} else {
return callback({'err': true, 'code': 'ssc', 'msg': 'Drug A and B are the same safety category.'});
}
}
} else {
return callback(false);
}
} else {
return callback({'err': true, 'msg': 'Drug B not found.'});
}
}.bind(this));
} else {
return callback({'err': true, 'msg': 'Drug A not found.'});
}
}.bind(this));
},
'getDrug': function(name, callback) {
name = name.toLowerCase();
this.db.read('drugs', name, function(err, drug) {
if(!drug) {
this.db.scan('drugs', function(dMatch) {
if(_.include(dMatch.aliases, name)) {
drug = dMatch;
if(!_.isUndefined(drug.aliases)) drug.properties.aliases = drug.aliases;
}
}, function() {
if(drug) {
if(!_.isUndefined(drug.aliases)) drug.properties.aliases = drug.aliases;
if(!_.isUndefined(drug.categories)) drug.properties.categories = drug.categories;
if(_.has(dbot.modules.tripsit.combos, drug.name)) {
drug.combos = dbot.modules.tripsit.combos[drug.name];
}
if(_.has(drug.properties, 'dose')) {
var doses = drug.properties.dose.split('|');
var regex = /(([\w-]+):\s([\/\.\w\d-\+µ]+))/ig;
drug.formatted_dose = {};
if(doses.length > 1 || !doses[0].split(' ')[0].match(':')) {
_.each(doses, function(dString) {
dString = dString.replace(/\s\s+/g, ' ');
var roa = dString.trim().split(' ')[0];
var match = regex.exec(dString);
if(roa.match(/note/i)) {
drug.dose_note = dString;
} else {
drug.formatted_dose[roa] = {};
while(match != null) {
drug.formatted_dose[roa][match[2]] = match[3];
match = regex.exec(dString);
}
}
});
} else {
var roa = 'Oral';
var match = regex.exec(doses[0]);
if(roa.match(/note/i)) {
drug.dose_note = doses[0];
} else {
drug.formatted_dose[roa] = {};
while(match != null) {
drug.formatted_dose[roa][match[2]] = match[3];
match = regex.exec(doses[0]);
}
}
}
}
if(_.has(drug.properties, 'effects')) {
drug.formatted_effects = _.collect(drug.properties.effects.split(/[\.,]+/), function(item) {
return item.trim();
});
}
if(_.has(drug.properties, 'duration')) {
var roas = drug.properties.duration.split('|');
drug.formatted_duration = {};
if(roas.length > 1 || roas[0].match(':')) {
_.each(roas, function(roa) {
if(roa.toLowerCase().match('note')) {
return;
}
var match = roa.match(/([\w-\/]+):?\s([\.\w\d-\+]+)/i);
if(match) {
drug.formatted_duration[match[1]] = match[2];
}
});
} else {
var match = drug.properties['duration'].match(/([\.\w\d-\+]+)/i);
drug.formatted_duration = {'value':match[1]};
}
if(drug.properties.duration.indexOf('minutes') != -1) {
drug.formatted_duration._unit = 'minutes';
}
if(drug.properties.duration.indexOf('hours') != -1) {
drug.formatted_duration._unit = 'hours';
}
}
if(_.has(drug.properties, 'onset')) {
var roas = drug.properties.onset.split('|');
drug.formatted_onset = {};
if(roas.length > 1 || roas[0].match(':')) {
_.each(roas, function(roa) {
if(roa.toLowerCase().match('note')) {
return;
}
var match = roa.match(/([\w-\/]+):?\s([\.\w\d-\+]+)/i);
if(match) {
drug.formatted_onset[match[1]] = match[2];
}
});
} else {
var match = drug.properties['onset'].match(/([\.\w\d-\+]+)/i);
drug.formatted_onset = {'value':match[1]};
}
if(drug.properties.onset.indexOf('minutes') != -1) {
drug.formatted_onset._unit = 'minutes';
}
if(drug.properties.onset.indexOf('hours') != -1) {
drug.formatted_onset._unit = 'hours';
}
}
if(_.has(drug.properties, 'after-effects')) {
var roas = drug.properties['after-effects'].split('|');
drug.formatted_aftereffects = {};
if(roas.length > 1 || roas[0].match(':')) {
_.each(roas, function(roa) {
if(roa.toLowerCase().match('note')) {
return;
}
var match = roa.match(/([\w\/]+):?\s([\.\w\d-\+]+)/i);
if(match) {
drug.formatted_aftereffects[match[1]] = match[2];
}
});
} else {
var match = drug.properties['after-effects'].match(/([\.\w\d-\+]+)/i);
drug.formatted_aftereffects = {'value':match[1]};
}
if(drug.properties['after-effects'].indexOf('minutes') != -1) {
drug.formatted_aftereffects._unit = 'minutes';
}
if(drug.properties['after-effects'].indexOf('hours') != -1) {
drug.formatted_aftereffects._unit = 'hours';
}
}
if(!_.has(drug, 'pretty_name')) {
drug.pretty_name = drug.name;
if(drug.name.length <= 4 || drug.name.indexOf('-') != -1) {
drug.pretty_name = drug.name.toUpperCase();
} else {
drug.pretty_name = drug.name.charAt(0).toUpperCase() + drug.name.slice(1);
}
drug.pretty_name = drug.pretty_name.replace(/MEO/, 'MeO');
drug.pretty_name = drug.pretty_name.replace(/ACO/, 'AcO');
drug.pretty_name = drug.pretty_name.replace(/NBOME/, 'NBOMe');
drug.pretty_name = drug.pretty_name.replace(/MIPT/, 'MiPT');
drug.pretty_name = drug.pretty_name.replace(/DIPT/, 'DiPT');
}
}
if(drug) {
callback(drug);
} else {
callback({'err': true, 'msg': 'No drug found.'});
}
});
} else {
if(drug) {
if(!_.isUndefined(drug.aliases)) drug.properties.aliases = drug.aliases;
if(!_.isUndefined(drug.categories)) drug.properties.categories = drug.categories;
if(_.has(dbot.modules.tripsit.combos, drug.name)) {
drug.combos = dbot.modules.tripsit.combos[drug.name];
}
if(_.has(drug.properties, 'dose')) {
var doses = drug.properties.dose.split('|');
var regex = /(([\w-]+):\s([\/\.\w\d-\+µ]+))/ig;
drug.formatted_dose = {};
if(doses.length > 1 || !doses[0].split(' ')[0].match(':')) {
_.each(doses, function(dString) {
dString = dString.replace(/\s\s+/g, ' ');
var roa = dString.trim().split(' ')[0];
var match = regex.exec(dString);
if(roa.match(/note/i)) {
drug.dose_note = dString;
} else {
drug.formatted_dose[roa] = {};
while(match != null) {
drug.formatted_dose[roa][match[2]] = match[3];
match = regex.exec(dString);
}
}
});
} else {
var roa = 'Oral';
var match = regex.exec(doses[0]);
if(roa.match(/note/i)) {
drug.dose_note = doses[0];
} else {
drug.formatted_dose[roa] = {};
while(match != null) {
drug.formatted_dose[roa][match[2]] = match[3];
match = regex.exec(doses[0]);
}
}
}
}
if(_.has(drug.properties, 'effects')) {
drug.formatted_effects = _.collect(drug.properties.effects.split(/[\.,]+/), function(item) {
return item.trim();
});
}
if(_.has(drug.properties, 'duration')) {
var roas = drug.properties.duration.split('|');
drug.formatted_duration = {};
if(roas.length > 1 || roas[0].match(':')) {
_.each(roas, function(roa) {
if(roa.toLowerCase().match('note')) {
return;
}
var match = roa.match(/([\w-\/]+):?\s([\.\w\d-\+]+)/i);
if(match) {
drug.formatted_duration[match[1]] = match[2];
}
});
} else {
var match = drug.properties['duration'].match(/([\.\w\d-\+]+)/i);
drug.formatted_duration = {'value':match[1]};
}
if(drug.properties.duration.indexOf('minutes') != -1) {
drug.formatted_duration._unit = 'minutes';
}
if(drug.properties.duration.indexOf('hours') != -1) {
drug.formatted_duration._unit = 'hours';
}
}
if(_.has(drug.properties, 'onset')) {
var roas = drug.properties.onset.split('|');
drug.formatted_onset = {};
if(roas.length > 1 || roas[0].match(':')) {
_.each(roas, function(roa) {
if(roa.toLowerCase().match('note')) {
return;
}
var match = roa.match(/([\/\w-]+):??\s([\.\w\d-\+]+)/i);
if(match) {
drug.formatted_onset[match[1]] = match[2];
}
});
} else {
var match = drug.properties['onset'].match(/([\.\w\d-\+]+)/i);
drug.formatted_onset = {'value':match[1]};
}
if(drug.properties.onset.indexOf('minutes') != -1) {
drug.formatted_onset._unit = 'minutes';
}
if(drug.properties.onset.indexOf('hours') != -1) {
drug.formatted_onset._unit = 'hours';
}
}
if(_.has(drug.properties, 'after-effects')) {
var roas = drug.properties['after-effects'].split('|');
drug.formatted_aftereffects = {};
if(roas.length > 1 || roas[0].match(':')) {
_.each(roas, function(roa) {
if(roa.toLowerCase().match('note')) {
return;
}
var match = roa.match(/([\w\/]+):?\s([\.\w\d-\+]+)/i);
if(match) {
drug.formatted_aftereffects[match[1]] = match[2];
}
});
} else {
var match = drug.properties['after-effects'].match(/([\.\w\d-\+]+)/i);
drug.formatted_aftereffects = {'value':match[1]};
}
if(drug.properties['after-effects'].indexOf('minutes') != -1) {
drug.formatted_aftereffects._unit = 'minutes';
}
if(drug.properties['after-effects'].indexOf('hours') != -1) {
drug.formatted_aftereffects._unit = 'hours';
}
}
if(!_.has(drug, 'pretty_name')) {
drug.pretty_name = drug.name;
if(drug.name.length <= 4 || drug.name.indexOf('-') != -1) {
drug.pretty_name = drug.name.toUpperCase();
} else {
drug.pretty_name = drug.name.charAt(0).toUpperCase() + drug.name.slice(1);
}
drug.pretty_name = drug.pretty_name.replace(/MEO/, 'MeO');
drug.pretty_name = drug.pretty_name.replace(/ACO/, 'AcO');
drug.pretty_name = drug.pretty_name.replace(/NBOME/, 'NBOMe');
drug.pretty_name = drug.pretty_name.replace(/MIPT/, 'MiPT');
drug.pretty_name = drug.pretty_name.replace(/DIPT/, 'DiPT');
}
}
if(drug) {
callback(drug);
} else {
callback({'err': true, 'msg': 'No drug found.'});
}
}
}.bind(this));
},
'getAllDrugNames': function(callback) {
var names = [];
this.db.scan('drugs', function(drug) {
if(drug) {
names.push(drug.name);
}
}, function() {
callback(names);
});
},
'getAllDrugNamesByCategory': function(category, callback) {
this.api.getAllDrugs(function(names) {
callback(_.pluck(_.filter(names, function(a) { return _.include(a.categories, category); }), 'name'));
});
},
'getAllDrugs': function(callback) {
this.api.getAllDrugNames(function(names) {
var drugs = {};
async.each(names, function(name, done) {
if(!_.isUndefined(name)) {
this.api.getDrug(name, function(drug) {
drugs[name] = drug;
done();
});
} else {
done();
}
}.bind(this), function() {
callback(drugs);
});
}.bind(this));
},
'getAllCategories': function(callback) {
var categories = {};
this.db.scan('drug_categories', function(cat) {
categories[cat.name] = cat;
}, function() {
callback(categories);
});
},
'getAllDrugAliases': function(callback) {
this.api.getAllDrugNames(function(names) {
var fullNames = [];
async.each(names, function(name, done) {
if(!_.isUndefined(name)) {
this.api.getDrug(name, function(drug) {
fullNames.push(name);
fullNames = _.union(fullNames, drug.aliases);
done();
});
} else {
done();
}
}.bind(this), function() {
callback(fullNames);
});
}.bind(this));
},
'delDrug': function(name, callback) {
this.db.del('drugs', name.toLowerCase(), function() {
callback();
});
},
'setDrugProperty': function(drug, property, content, callback) {
drug.properties[property] = content;
this.db.save('drugs', drug.name, drug, callback);
},
'setCategoryProperty': function(category, property, content, callback) {
category[property] = content;
this.db.save('drug_categories', category.name, category, callback);
},
'delDrugProperty': function(drug, property, callback) {
delete drug.properties[property];
this.db.save('drugs', drug.name, drug, callback);
},
'createDrug': function(name, callback) {
name = name.toLowerCase();
this.db.create('drugs', name, {
'name': name,
'properties': {}
}, callback);
}
};
api['getDrug'].external = true;
api['getDrug'].extMap = [ 'name', 'callback' ];
api['getAllDrugNames'].external = true;
api['getAllDrugNames'].extMap = [ 'callback' ];
api['getAllDrugNamesByCategory'].external = true;
api['getAllDrugNamesByCategory'].extMap = [ 'category', 'callback' ];
api['getAllDrugAliases'].external = true;
api['getAllDrugAliases'].extMap = [ 'callback' ];
api['getAllDrugs'].external = true;
api['getAllDrugs'].extMap = [ 'callback' ];
api['getAllCategories'].external = true;
api['getAllCategories'].extMap = [ 'callback' ];
api['getInteraction'].external = true;
api['getInteraction'].extMap = [ 'drugA', 'drugB', 'callback' ];
return api;
};
exports.fetch = function(dbot) {
return api(dbot);
};

755
tripsit/combo.json Normal file
View File

@ -0,0 +1,755 @@
{
"lsd": {
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Safe & Synergy",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Safe & Synergy",
"αmt": "Safe & Synergy",
"5-meo-xxt": "Safe & Synergy",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Safe & Synergy",
"dxm": "Safe & Synergy",
"pcp": "Safe & Synergy",
"nitrous": "Safe & Synergy",
"amphetamines": "Safe & No Synergy",
"mdma": "Safe & Synergy",
"cocaine": "Safe & No Synergy",
"caffeine": "Safe & No Synergy",
"alcohol": "Safe & No Synergy",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Safe & No Synergy",
"tramadol": "Safe & Decrease",
"benzodiazepines": "Safe & Decrease",
"maois": "Safe & Decrease",
"ssris": "Safe & Decrease"
},
"mushrooms": {
"lsd": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Safe & Synergy",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Safe & Synergy",
"αmt": "Safe & Synergy",
"5-meo-xxt": "Safe & Synergy",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Safe & Synergy",
"dxm": "Safe & Synergy",
"pcp": "Safe & Synergy",
"nitrous": "Safe & Synergy",
"amphetamines": "Safe & No Synergy",
"mdma": "Safe & Synergy",
"cocaine": "Safe & No Synergy",
"caffeine": "Safe & No Synergy",
"alcohol": "Safe & No Synergy",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Safe & No Synergy",
"tramadol": "Safe & Decrease",
"benzodiazepines": "Safe & Decrease",
"maois": "Safe & Synergy",
"ssris": "Safe & Decrease"
},
"dmt": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Safe & Synergy",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Safe & Synergy",
"αmt": "Safe & Synergy",
"5-meo-xxt": "Safe & Synergy",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Safe & Synergy",
"dxm": "Safe & Synergy",
"pcp": "Safe & Synergy",
"nitrous": "Safe & Synergy",
"amphetamines": "Safe & No Synergy",
"mdma": "Safe & Synergy",
"cocaine": "Safe & No Synergy",
"caffeine": "Safe & No Synergy",
"alcohol": "Safe & Decrease",
"ghb/gbl": "Safe & Decrease",
"opioids": "Safe & No Synergy",
"tramadol": "Safe & Decrease",
"benzodiazepines": "Safe & Decrease",
"maois": "Safe & Synergy",
"ssris": "Safe & Decrease"
},
"mescaline": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"dox": "Safe & Synergy",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Unsafe",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Safe & Synergy",
"dxm": "Safe & Synergy",
"pcp": "Safe & Synergy",
"nitrous": "Safe & Synergy",
"amphetamines": "Safe & No Synergy",
"mdma": "Safe & Synergy",
"cocaine": "Safe & No Synergy",
"caffeine": "Safe & No Synergy",
"alcohol": "Safe & No Synergy",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Safe & No Synergy",
"tramadol": "Deadly",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Safe & Decrease"
},
"dox": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Unsafe",
"cannabis": "Safe & Synergy",
"ketamine": "Unsafe",
"mxe": "Unsafe",
"dxm": "Unsafe",
"pcp": "Unsafe",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"mdma": "Unsafe",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Unsafe",
"ghb/gbl": "Unsafe",
"opioids": "Unsafe",
"tramadol": "Deadly",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Safe & Decrease"
},
"nbomes": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Unsafe",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Safe & Synergy",
"dxm": "Safe & Synergy",
"pcp": "Safe & Synergy",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"mdma": "Safe & Synergy",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Safe & No Synergy",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Safe & No Synergy",
"tramadol": "Deadly",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Safe & Decrease"
},
"2c-x": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Safe & Synergy",
"nbomes": "Safe & Synergy",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Unsafe",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Safe & Synergy",
"dxm": "Safe & Synergy",
"pcp": "Safe & Synergy",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"mdma": "Safe & Synergy",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Safe & No Synergy",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Safe & No Synergy",
"tramadol": "Deadly",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Safe & Decrease"
},
"2c-t-x": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Serotonin Syndrome",
"dox": "Serotonin Syndrome",
"nbomes": "Serotonin Syndrome",
"2c-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Serotonin Syndrome",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Serotonin Syndrome",
"dxm": "Serotonin Syndrome",
"pcp": "Serotonin Syndrome",
"nitrous": "Safe & Synergy",
"amphetamines": "Serotonin Syndrome",
"mdma": "Serotonin Syndrome",
"cocaine": "Serotonin Syndrome",
"caffeine": "Unsafe",
"alcohol": "Unsafe",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Unsafe",
"tramadol": "Serotonin Syndrome",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Serotonin Syndrome"
},
"αmt": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Serotonin Syndrome",
"dox": "Serotonin Syndrome",
"nbomes": "Serotonin Syndrome",
"2c-x": "Serotonin Syndrome",
"2c-t-x": "Serotonin Syndrome",
"5-meo-xxt": "Serotonin Syndrome",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Serotonin Syndrome",
"dxm": "Serotonin Syndrome",
"pcp": "Serotonin Syndrome",
"nitrous": "Safe & Synergy",
"amphetamines": "Serotonin Syndrome",
"mdma": "Serotonin Syndrome",
"cocaine": "Serotonin Syndrome",
"caffeine": "Unsafe",
"alcohol": "Unsafe",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Unsafe",
"tramadol": "Serotonin Syndrome",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Serotonin Syndrome"
},
"5-meo-xxt": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Unsafe",
"dox": "Unsafe",
"nbomes": "Unsafe",
"2c-x": "Unsafe",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"mdma": "Unsafe",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Safe & No Synergy",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Safe & No Synergy",
"tramadol": "Serotonin Syndrome",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Serotonin Syndrome"
},
"cannabis": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Safe & Synergy",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Safe & Synergy",
"αmt": "Safe & Synergy",
"5-meo-xxt": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Safe & Synergy",
"dxm": "Safe & Synergy",
"pcp": "Safe & Synergy",
"nitrous": "Safe & Synergy",
"amphetamines": "Safe & No Synergy",
"mdma": "Safe & Synergy",
"cocaine": "Safe & No Synergy",
"caffeine": "Safe & No Synergy",
"alcohol": "Safe & No Synergy",
"ghb/gbl": "Safe & Synergy",
"opioids": "Safe & Synergy",
"tramadol": "Safe & Synergy",
"benzodiazepines": "Safe & Decrease",
"maois": "Safe & Synergy",
"ssris": "Safe & No Synergy"
},
"ketamine": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Unsafe",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Safe & Synergy",
"αmt": "Safe & Synergy",
"5-meo-xxt": "Safe & Synergy",
"cannabis": "Safe & Synergy",
"mxe": "Safe & Synergy",
"dxm": "Safe & No Synergy",
"pcp": "Safe & Synergy",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"mdma": "Safe & Synergy",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Deadly",
"ghb/gbl": "Deadly",
"opioids": "Deadly",
"tramadol": "Deadly",
"benzodiazepines": "Unsafe",
"maois": "Safe & No Synergy",
"ssris": "Safe & No Synergy"
},
"mxe": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Unsafe",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Serotonin Syndrome",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"dxm": "Serotonin Syndrome",
"pcp": "Serotonin Syndrome",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"mdma": "Unsafe",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Deadly",
"ghb/gbl": "Deadly",
"opioids": "Deadly",
"tramadol": "Serotonin Syndrome",
"benzodiazepines": "Unsafe",
"maois": "Serotonin Syndrome",
"ssris": "Unsafe"
},
"dxm": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Unsafe",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Serotonin Syndrome",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & No Synergy",
"mxe": "Serotonin Syndrome",
"pcp": "Serotonin Syndrome",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"mdma": "Serotonin Syndrome",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Deadly",
"ghb/gbl": "Deadly",
"opioids": "Deadly",
"tramadol": "Serotonin Syndrome",
"benzodiazepines": "Unsafe",
"maois": "Serotonin Syndrome",
"ssris": "Serotonin Syndrome"
},
"pcp": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Unsafe",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Serotonin Syndrome",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Serotonin Syndrome",
"dxm": "Serotonin Syndrome",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"mdma": "Unsafe",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Deadly",
"ghb/gbl": "Deadly",
"opioids": "Deadly",
"tramadol": "Serotonin Syndrome",
"benzodiazepines": "Unsafe",
"maois": "Serotonin Syndrome",
"ssris": "Unsafe"
},
"nitrous": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Safe & Synergy",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Safe & Synergy",
"αmt": "Safe & Synergy",
"5-meo-xxt": "Safe & Synergy",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Safe & Synergy",
"dxm": "Safe & Synergy",
"pcp": "Safe & Synergy",
"amphetamines": "Safe & Synergy",
"mdma": "Safe & Synergy",
"cocaine": "Safe & Synergy",
"caffeine": "Safe & No Synergy",
"alcohol": "Unsafe",
"ghb/gbl": "Unsafe",
"opioids": "Safe & Decrease",
"tramadol": "Safe & Decrease",
"benzodiazepines": "Safe & Decrease",
"maois": "Safe & No Synergy",
"ssris": "Safe & No Synergy"
},
"amphetamines": {
"lsd": "Safe & No Synergy",
"mushrooms": "Safe & No Synergy",
"dmt": "Safe & No Synergy",
"mescaline": "Safe & No Synergy",
"dox": "Unsafe",
"nbomes": "Unsafe",
"2c-x": "Unsafe",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Unsafe",
"cannabis": "Safe & No Synergy",
"ketamine": "Unsafe",
"mxe": "Unsafe",
"dxm": "Unsafe",
"pcp": "Unsafe",
"nitrous": "Safe & Synergy",
"mdma": "Unsafe",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Unsafe",
"ghb/gbl": "Unsafe",
"opioids": "Unsafe",
"tramadol": "Deadly",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Safe & No Synergy"
},
"mdma": {
"lsd": "Safe & Synergy",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Safe & Synergy",
"dox": "Unsafe",
"nbomes": "Safe & Synergy",
"2c-x": "Safe & Synergy",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Unsafe",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & Synergy",
"mxe": "Unsafe",
"dxm": "Serotonin Syndrome",
"pcp": "Unsafe",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"cocaine": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Unsafe",
"ghb/gbl": "Safe & Synergy",
"opioids": "Unsafe",
"tramadol": "Deadly",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Safe & Decrease"
},
"cocaine": {
"lsd": "Safe & No Synergy",
"mushrooms": "Safe & No Synergy",
"dmt": "Safe & No Synergy",
"mescaline": "Safe & No Synergy",
"dox": "Unsafe",
"nbomes": "Unsafe",
"2c-x": "Unsafe",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Unsafe",
"cannabis": "Safe & No Synergy",
"ketamine": "Unsafe",
"mxe": "Unsafe",
"dxm": "Unsafe",
"pcp": "Unsafe",
"nitrous": "Safe & Synergy",
"amphetamines": "Unsafe",
"mdma": "Unsafe",
"caffeine": "Unsafe",
"alcohol": "Unsafe",
"ghb/gbl": "Unsafe",
"opioids": "Deadly",
"tramadol": "Deadly",
"benzodiazepines": "Safe & Decrease",
"maois": "Serotonin Syndrome",
"ssris": "Unsafe"
},
"caffeine": {
"lsd": "Safe & No Synergy",
"mushrooms": "Safe & No Synergy",
"dmt": "Safe & No Synergy",
"mescaline": "Safe & No Synergy",
"dox": "Unsafe",
"nbomes": "Unsafe",
"2c-x": "Unsafe",
"2c-t-x": "Unsafe",
"αmt": "Unsafe",
"5-meo-xxt": "Unsafe",
"cannabis": "Safe & No Synergy",
"ketamine": "Unsafe",
"mxe": "Unsafe",
"dxm": "Unsafe",
"pcp": "Unsafe",
"nitrous": "Safe & No Synergy",
"amphetamines": "Unsafe",
"mdma": "Unsafe",
"cocaine": "Unsafe",
"alcohol": "Safe & No Synergy",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Safe & No Synergy",
"tramadol": "Safe & Synergy",
"benzodiazepines": "Safe & Decrease",
"maois": "Safe & No Synergy",
"ssris": "Safe & No Synergy"
},
"alcohol": {
"lsd": "Safe & No Synergy",
"mushrooms": "Safe & No Synergy",
"dmt": "Safe & Decrease",
"mescaline": "Safe & No Synergy",
"dox": "Unsafe",
"nbomes": "Safe & No Synergy",
"2c-x": "Safe & No Synergy",
"2c-t-x": "Unsafe",
"αmt": "Unsafe",
"5-meo-xxt": "Safe & No Synergy",
"cannabis": "Safe & No Synergy",
"ketamine": "Deadly",
"mxe": "Deadly",
"dxm": "Deadly",
"pcp": "Deadly",
"nitrous": "Unsafe",
"amphetamines": "Unsafe",
"mdma": "Unsafe",
"cocaine": "Unsafe",
"caffeine": "Safe & No Synergy",
"ghb/gbl": "Deadly",
"opioids": "Deadly",
"tramadol": "Deadly",
"benzodiazepines": "Deadly",
"maois": "Unsafe",
"ssris": "Unsafe"
},
"ghb/gbl": {
"lsd": "Safe & No Synergy",
"mushrooms": "Safe & No Synergy",
"dmt": "Safe & Decrease",
"mescaline": "Safe & No Synergy",
"dox": "Unsafe",
"nbomes": "Safe & No Synergy",
"2c-x": "Safe & No Synergy",
"2c-t-x": "Safe & No Synergy",
"αmt": "Safe & No Synergy",
"5-meo-xxt": "Safe & No Synergy",
"cannabis": "Safe & Synergy",
"ketamine": "Deadly",
"mxe": "Deadly",
"dxm": "Deadly",
"pcp": "Deadly",
"nitrous": "Unsafe",
"amphetamines": "Unsafe",
"mdma": "Safe & Synergy",
"cocaine": "Unsafe",
"caffeine": "Safe & No Synergy",
"alcohol": "Deadly",
"opioids": "Deadly",
"tramadol": "Deadly",
"benzodiazepines": "Deadly",
"maois": "Safe & Synergy",
"ssris": "Safe & No Synergy"
},
"opioids": {
"lsd": "Safe & No Synergy",
"mushrooms": "Safe & No Synergy",
"dmt": "Safe & No Synergy",
"mescaline": "Safe & No Synergy",
"dox": "Unsafe",
"nbomes": "Safe & No Synergy",
"2c-x": "Safe & No Synergy",
"2c-t-x": "Unsafe",
"αmt": "Unsafe",
"5-meo-xxt": "Safe & No Synergy",
"cannabis": "Safe & Synergy",
"ketamine": "Deadly",
"mxe": "Deadly",
"dxm": "Deadly",
"pcp": "Deadly",
"nitrous": "Safe & Decrease",
"amphetamines": "Unsafe",
"mdma": "Unsafe",
"cocaine": "Deadly",
"caffeine": "Safe & No Synergy",
"alcohol": "Deadly",
"ghb/gbl": "Deadly",
"tramadol": "Deadly",
"benzodiazepines": "Deadly",
"maois": "Unsafe",
"ssris": "Serotonin Syndrome"
},
"tramadol": {
"lsd": "Safe & Decrease",
"mushrooms": "Safe & Decrease",
"dmt": "Safe & Decrease",
"mescaline": "Deadly",
"dox": "Deadly",
"nbomes": "Deadly",
"2c-x": "Deadly",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Serotonin Syndrome",
"cannabis": "Safe & Synergy",
"ketamine": "Deadly",
"mxe": "Serotonin Syndrome",
"dxm": "Serotonin Syndrome",
"pcp": "Serotonin Syndrome",
"nitrous": "Safe & Decrease",
"amphetamines": "Deadly",
"mdma": "Deadly",
"cocaine": "Deadly",
"caffeine": "Safe & Synergy",
"alcohol": "Deadly",
"ghb/gbl": "Deadly",
"opioids": "Deadly",
"benzodiazepines": "Deadly",
"maois": "Serotonin Syndrome",
"ssris": "Serotonin Syndrome"
},
"benzodiazepines": {
"lsd": "Safe & Decrease",
"mushrooms": "Safe & Decrease",
"dmt": "Safe & Decrease",
"mescaline": "Safe & Decrease",
"dox": "Safe & Decrease",
"nbomes": "Safe & Decrease",
"2c-x": "Safe & Decrease",
"2c-t-x": "Safe & Decrease",
"αmt": "Safe & Decrease",
"5-meo-xxt": "Safe & Decrease",
"cannabis": "Safe & Decrease",
"ketamine": "Unsafe",
"mxe": "Unsafe",
"dxm": "Unsafe",
"pcp": "Unsafe",
"nitrous": "Safe & Decrease",
"amphetamines": "Safe & Decrease",
"mdma": "Safe & Decrease",
"cocaine": "Safe & Decrease",
"caffeine": "Safe & Decrease",
"alcohol": "Deadly",
"ghb/gbl": "Deadly",
"opioids": "Deadly",
"tramadol": "Deadly",
"maois": "Safe & Synergy",
"ssris": "Safe & No Synergy"
},
"maois": {
"lsd": "Safe & Decrease",
"mushrooms": "Safe & Synergy",
"dmt": "Safe & Synergy",
"mescaline": "Serotonin Syndrome",
"dox": "Serotonin Syndrome",
"nbomes": "Serotonin Syndrome",
"2c-x": "Serotonin Syndrome",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Serotonin Syndrome",
"cannabis": "Safe & Synergy",
"ketamine": "Safe & No Synergy",
"mxe": "Serotonin Syndrome",
"dxm": "Serotonin Syndrome",
"pcp": "Serotonin Syndrome",
"nitrous": "Safe & No Synergy",
"amphetamines": "Serotonin Syndrome",
"mdma": "Serotonin Syndrome",
"cocaine": "Serotonin Syndrome",
"caffeine": "Safe & No Synergy",
"alcohol": "Unsafe",
"ghb/gbl": "Safe & Synergy",
"opioids": "Unsafe",
"tramadol": "Serotonin Syndrome",
"benzodiazepines": "Safe & Synergy",
"ssris": "Serotonin Syndrome"
},
"ssris": {
"lsd": "Safe & Decrease",
"mushrooms": "Safe & Decrease",
"dmt": "Safe & Decrease",
"mescaline": "Safe & Decrease",
"dox": "Safe & Decrease",
"nbomes": "Safe & Decrease",
"2c-x": "Safe & Decrease",
"2c-t-x": "Serotonin Syndrome",
"αmt": "Serotonin Syndrome",
"5-meo-xxt": "Serotonin Syndrome",
"cannabis": "Safe & No Synergy",
"ketamine": "Safe & No Synergy",
"mxe": "Unsafe",
"dxm": "Serotonin Syndrome",
"pcp": "Unsafe",
"nitrous": "Safe & No Synergy",
"amphetamines": "Safe & No Synergy",
"mdma": "Safe & Decrease",
"cocaine": "Unsafe",
"caffeine": "Safe & No Synergy",
"alcohol": "Unsafe",
"ghb/gbl": "Safe & No Synergy",
"opioids": "Serotonin Syndrome",
"tramadol": "Serotonin Syndrome",
"benzodiazepines": "Safe & No Synergy",
"maois": "Serotonin Syndrome"
}
}

6
tripsit/config.json Normal file
View File

@ -0,0 +1,6 @@
{
"dependencies": [ "report" ],
"tripsitters": [],
"dbType": "redis",
"wikiTemplate": "= General Information = \n{summary}\nCategories: {categories} \n\n== History ==\n\n= Dosage = \n {dose} \n\n= Duration =\nOnset: {onset}\nDuration: {duration}\nAfter-effects: {after-effects} \n\n= Effects = \n {effects} \n\n=Harm Reduction= \n Avoid: {avoid} \n\n= Chemistry and Pharmacology = \n\n= Storage = \n\n= Legal ="
}

184
tripsit/pages.js Normal file
View File

@ -0,0 +1,184 @@
var _ = require('underscore');
var cap = function(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
var pages = function(dbot) {
var pages = {
'/factsheet/test': function(req, res) {
res.end(req.user.access);
},
'/factsheet/wikitemplate/:drug': function(req, res) {
this.api.getDrug(req.params.drug, function(drug) {
if(drug) {
d = drug.properties;
if(!_.has(d,'categories')) d.categories = [];
res.header("Content-Type", "text/plain; charset=utf-8");
var template = this.config.wikiTemplate.format({
'dose': d.dose,
'onset': d.onset,
'duration': d.duration,
'avoid': d.avoid,
'categories': d.categories.join(', '),
'summary': d.summary,
'after-effects': d['after-effects'],
'effects': d.effects
});
template += '\n\n[[Category:Drugs]]\n';
_.each(d.categories,function(cat){template+='[[Category:'+cap(cat)+']]\n';});
res.end(template);
}
}.bind(this));
},
'/factsheet': function(req, res) {
var drugs = [];
this.db.scan('drugs', function(drug) {
if(drug && _.has(drug, 'name') && _.has(drug, 'properties')) {
if(drug.name.length <= 4 || drug.name.indexOf('-') != -1) {
drug.name = drug.name.toUpperCase();
} else {
drug.name = drug.name.charAt(0).toUpperCase() + drug.name.slice(1);
}
drug.name = drug.name.replace(/MEO/, 'MeO');
drug.name = drug.name.replace(/ACO/, 'AcO');
drug.name = drug.name.replace(/NBOME/, 'NBOMe');
drug.name = drug.name.replace(/MIPT/, 'MiPT');
drug.name = drug.name.replace(/DIPT/, 'DiPT');
drugs.push(drug);
}
}, function() {
drugs = _.sortBy(drugs, 'name');
res.render('fs_list', {
'drugs': drugs,
'thing': 'Factsheets'
});
});
},
'/factsheet/edit': function(req, res) {
var name = req.body.name,
params = req.body,
pValues = _.omit(params, 'name', 'newname', 'categories', 'aliases', 'formatted_dose'),
response = {
'error': null,
'drug': null
};
if(!_.has(req, 'user') || (_.has(req, 'user') && req.user.access == 'user')) {
response.error = 'Unauthenticated.';
return res.json(response);
}
this.api.getDrug(params.name, function(drug) {
if(drug) {
if(_.has(params, 'categories')) {
var categories = params.categories.replace(/\s/g,'').split(',');
availableCategories = [ 'psychedelic', 'benzodiazepine',
'dissociative', 'opioid', 'depressant', 'common', 'stimulant', 'habit-forming', 'research-chemical', 'empathogen', 'deliriant', 'nootropic', 'tentative', 'inactive' ];
if(_.difference(categories, availableCategories).length !== 0) {
response.error = 'Invalid category.';
return res.json(response);
}
}
drug.categories = categories;
_.each(pValues, function(property, index) {
drug.properties[index] = property;
});
this.db.save('drugs', drug.name, drug, function(err, drug) {
if(_.has(params, 'newname') && params.newname !== drug.name) {
this.api.getDrug(params.newname, function(oDrug) {
if(oDrug) {
response.error = params.newname + ' already exists.';
return res.json(response);
} else {
this.api.delDrug(drug.name, function() {
drug.name = params.newname;
this.db.create('drugs', drug.name, drug, function() {
this.api.getDrug(drug.name, function(drug) {
response.drug = drug;
res.json(response);
dbot.say('tripsit', '#content', dbot.t('websetdrug_log', {
'user': req.user.primaryNick,
'drug': drug.name
}));
});
}.bind(this));
}.bind(this));
}
}.bind(this));
} else {
this.api.getDrug(drug.name, function(drug) {
response.drug = drug;
res.json(response);
dbot.say('tripsit', '#content', dbot.t('websetdrug_log', {
'user': req.user.primaryNick,
'drug': drug.name
}));
});
}
}.bind(this));
} else {
response.error = 'Unknown drug.';
res.json(response);
}
}.bind(this));
},
'/factsheet/:drug': function(req, res) {
this.api.getDrug(req.params.drug, function(drug) {
if(drug && !_.has(drug, 'err')) {
if(drug.name.length <= 3 || drug.name.indexOf('-') != -1) {
drug.name = drug.name.toUpperCase();
} else {
drug.name = drug.name.charAt(0).toUpperCase() + drug.name.slice(1);
}
if(_.has(drug.properties, 'dose')) { // LAAAAME
drug.properties.dose = drug.properties.dose.split('|');
}
if(_.has(drug.properties, 'onset')) { // LAAAAME
drug.properties.onset = drug.properties.onset.split('|');
}
if(_.has(drug.properties, 'wiki')) { // This is also kinda lame
drug.wiki = drug.properties.wiki;
delete drug.properties.wiki;
}
var order = _.union(['summary', 'dose', 'onset', 'duration'], _.keys(drug.properties));
res.render('factsheet', {
'drug': drug,
'order': order,
'thing': drug.name + ' Factsheet'
});
} else {
res.render('error', {
'name': req.params.drug
});
}
});
},
'/chanlist': function(req, res) {
res.render('oclist', {
'channels': this.channels
});
}
};
pages['/factsheet/edit'].type = 'post';
return pages;
}
exports.fetch = function(dbot) {
return pages(dbot);
};

53
tripsit/strings.json Normal file
View File

@ -0,0 +1,53 @@
{
"tripsit_help": {
"en": "Attention: {user} needs some help in {channel}",
"fr": "Attention : {user} a besoin d'aide dans {channel}.",
"de": "Achtung: {user} benötigt Hilfe in {channel}."
},
"tripsit_help_confirm": {
"en": "{user}: Thanks, we've notified our tripsitters and they'll be with you shortly. In the mean time you can help us help you by sharing your substance, dose, time of dose, mindset and any other relevant info. Remember, you're in good hands here.",
"fr": "{user} : Merci, nous avons notifié nos tripsitters et ils seront bientôt avec vous. En attendant, vous pouvez nous aider en indiquant la substance consommée, la dose, l'heure de prise, votre état d'esprit et tout autre information importante. Rappelez-vous, vous êtes entre de bonnes mains ici.",
"de": "{user}: Danke, wir haben unsere tripsitter informiert und sie werden sich in Kürze bei dir melden. In der Zwischenzeit kannst du uns helfen, indem du uns Substanz, Dosis, Mindset und andere relevanten Informationen mitteilst. Denk dran, du bist in guten Händen hier."
},
"tripsit_notifies_on": {
"en": "You will now receive notifications of new users in #tripsit.",
"de": "Du wirst keine Benachrichtigungen von neuen Benutzern in #tripsit erhalten."
},
"tripsit_already_notified": {
"en": "You were already receiving notifications of new users in #tripsit.",
"de": "Du erhälst bereits Benachrichtigungen von neuen Benutzern in #tripsit."
},
"tripsit_notifies_off": {
"en": "You will no longer receive notifications of new users in #tripsit.",
"de": "Du wirst nicht länger Benachrichtigungen von neuen Benutzern in #tripsit erhalten."
},
"tripsit_notifies_already_off": {
"en": "You weren't receiving notifications of new users in #tripsit in the first place.",
"de": "Benachrichtigung von neuen Benutzern in #tripsit war bereits deaktiviert."
},
"new_tripsit_user": {
"en": "[{type}] {user} has joined #tripsit and may need some help.",
"de": "[{type}] {user} hat #tripsit betreten und benötigt möglicherweise etwas Hilfe."
},
"setdrug_log": {
"en": "[\u00036factsheets\u000f] {user} set {property} of {drug} to \"{content}\""
},
"addsource_log": {
"en": "[\u00036factsheets\u000f] {user} added source for {property} of {drug}: \"{content}\""
},
"rmsource_log": {
"en": "[\u00036factsheets\u000f] {user} removed source for {property} of {drug}: \"{content}\""
},
"websetdrug_log": {
"en": "[\u00036factsheets\u000f] {user} modified {drug} (web)"
},
"rmdrugproperty_log": {
"en": "[\u00036factsheets\u000f] {user} removed {property} from {drug}"
},
"rmdrug_log": {
"en": "[\u00036factsheets\u000f] {user} removed {property}"
},
"deleted_dupe": {
"en": "{creator}: Deleted duplicate #tripsit notification for {alias}, use #update"
}
}

1
tripsit/tripsit Submodule

@ -0,0 +1 @@
Subproject commit 3f952b039098db61c7fbeaf3a2b4140f12b0738a

1175
tripsit/tripsit.js Normal file

File diff suppressed because it is too large Load Diff

7
tripsit/usage.json Normal file
View File

@ -0,0 +1,7 @@
{
"~setdrug": "~setdrug [drugname] [propertyname] [content here]",
"~rmdrug": "~rmdrug [drugname] (propertyname)",
"~volume": "~volume [total material in mg] [target mg of material per ml]",
"~perml": "~perml [total material in mg] [ml of solution]",
"~oconvert": "~oconvert [amount]mg [sourceDrug] [targetROA] [targetDrug]"
}

View File

@ -0,0 +1,32 @@
extends ../layout
block content
p.text1
u
b ↳
a(href='/') Index
>
a(href='/factsheet') Factsheets
> #{drug.name}
table.table1
thead
tr
th.theader(style='width: 25%;')
| #{drug.name}
th.theader(style='width: 75%;')
| Info
table.table2
tbody.tbody1
for property, name in drug.properties
- name = name.charAt(0).toUpperCase() + name.slice(1);
tr
td.tlefttext(style='width: 25%;')
b #{name}
td.ttext(style='width: 75%;')
- if (typeof(property) === 'string'){
| #{property}
-} else {
-each line in property
| #{line}
br
-}

View File

@ -0,0 +1,48 @@
extends ../layout
block content
script(type="text/javascript", src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js")
p.text1
u
b ↳
a(href='/') Index
> Factsheets
p
table.table1
thead
tr
th.theader(style='width: 30%;')
| Name
th.theader(style='width: 70%;')
| Summary
table.table2
tbody.tbody1
-each drug in drugs
tr
td.ttext(style='width: 30%;')
a.boxed2(href='/factsheet/'+drug.name)
| #{drug.name}
if drug.categories
each kw in drug.categories
if kw == 'psychedelic'
span.label.label-warning(style='float:right;padding:3px;margin-right:5px;' data-placement="right") #{kw}
else if kw == 'benzodiazepine'
span.label.label-danger(style='background-color:#000;color:#FF0000;float:right;padding:3px;margin-right:5px;' data-placement="right") benzo
else if kw == 'stimulant'
span.label.label-info(style='float:right;padding:3px;margin-right:5px;' data-placement="right") stimulant
else if kw == 'dissociative'
span.label.label-default(style='background-color:purple;color:white;float:right;padding:3px;margin-right:5px;' data-placement="right") dissociative
else if kw == 'opioid'
span.label.label-success(style='float:right;padding:3px;margin-right:5px;' data-placement="right") opioid
else if kw == 'depressant'
span.label.label-danger(style='float:right;padding:3px;margin-right:5px;' data-placement="right") depressant
else
span.label.label-default(style='float:right;padding:3px;margin-right:5px;' data-placement="right") other
else
span.label.label-default(style='float:right;padding:3px;margin-right:5px;' data-placement="right") other
td.ttext(style='width: 70%;')
| #{drug.properties.summary}
p
p
b Factsheets on #{drugs.length} drugs

View File

@ -0,0 +1,32 @@
extends ../layout
block content
p.text1
u
b ↳
a(href='/') Index
>
a(href='/factsheet') Factsheets
> #{drug.name}
table.table1
thead
tr
th.theader(style='width: 25%;')
| #{drug.name}
th.theader(style='width: 75%;')
| Info
table.table2
tbody.tbody1
for property, name in drug.properties
- name = name.charAt(0).toUpperCase() + name.slice(1);
tr
td.tlefttext(style='width: 25%;')
b #{name}
td.ttext(style='width: 75%;')
- if (typeof(property) === 'string'){
| #{property}
-} else {
-each line in property
| #{line}
br
-}

View File

@ -0,0 +1,48 @@
extends ../layout
block content
script(type="text/javascript", src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js")
p.text1
u
b ↳
a(href='/') Index
> Factsheets
p
table.table1
thead
tr
th.theader(style='width: 30%;')
| Name
th.theader(style='width: 70%;')
| Summary
table.table2
tbody.tbody1
-each drug in drugs
tr
td.ttext(style='width: 30%;')
a.boxed2(href='/factsheet/'+drug.name)
| #{drug.name}
if drug.categories
each kw in drug.categories
if kw == 'psychedelic'
span.label.label-warning(style='float:right;padding:3px;margin-right:5px;' data-placement="right") #{kw}
else if kw == 'benzodiazepine'
span.label.label-danger(style='background-color:#000;color:#FF0000;float:right;padding:3px;margin-right:5px;' data-placement="right") benzo
else if kw == 'stimulant'
span.label.label-info(style='float:right;padding:3px;margin-right:5px;' data-placement="right") stimulant
else if kw == 'dissociative'
span.label.label-default(style='background-color:purple;color:white;float:right;padding:3px;margin-right:5px;' data-placement="right") dissociative
else if kw == 'opioid'
span.label.label-success(style='float:right;padding:3px;margin-right:5px;' data-placement="right") opioid
else if kw == 'depressant'
span.label.label-danger(style='float:right;padding:3px;margin-right:5px;' data-placement="right") depressant
else
span.label.label-default(style='float:right;padding:3px;margin-right:5px;' data-placement="right") other
else
span.label.label-default(style='float:right;padding:3px;margin-right:5px;' data-placement="right") other
td.ttext(style='width: 70%;')
| #{drug.properties.summary}
p
p
b Factsheets on #{drugs.length} drugs