'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// ==UserScript==
// @name 51talk选择最好最合适的老师-经验-好评率-年龄-收藏数
// @version 2019.12.20001
// @namespace https://github.com/niubilityfrontend
// @description 辅助选老师-排序显示,经验值计算|好评率|显示年龄|列表显示所有教师
// @author jimbo
// @license OSL-3.0
// @supportURL https://github.com/niubilityfrontend/hunttingteacheron51talk
// @match *://www.51talk.com/ReserveNew/index*
// @match *://www.51talk.com/TeacherNew/*
// @match *://www.51talk.com/user/*
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_listValues
// @grant GM_deleteValue
// @grant GM_registerMenuCommand
// @require http://code.jquery.com/jquery-3.4.1.min.js
// @require https://code.jquery.com/ui/1.12.1/jquery-ui.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/free-jqgrid/4.15.5/i18n/grid.locale-cn.js
// @require https://cdnjs.cloudflare.com/ajax/libs/free-jqgrid/4.15.5/jquery.jqgrid.min.js
// @require https://greasyfork.org/scripts/388372-scrollfix/code/scrollfix.js?version=726657
// @require https://greasyfork.org/scripts/389774-gm-config-toolbar/code/gm_config_toolbar.js?version=730739
// @downloadURL none
// ==/UserScript==
(function () {
'use strict';
//重载类型方法
(function () {
var _o;
var PropertiesCaseInsensitive = {
has: function has(target, prop) {
if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'symbol') {
return prop in target; // pass through; or 'return;' if you want to block pass through
}
prop = prop.toLowerCase();
if (prop in target) return true;
var keys = Object.keys(target);
var i = keys.length;
while (i--) {
if (keys[i] && keys[i].toLowerCase() == prop) return true;
}
return false;
},
get: function get(target, prop, receiver) {
if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'symbol') {
return target[prop];
}
prop = prop.toLowerCase();
if (prop in target) return target[prop];
var keys = Object.keys(target);
var i = keys.length;
while (i--) {
if (keys[i] && keys[i].toLowerCase() == prop) return target[keys[i]];
}
return undefined;
},
set: function set(target, prop, value) {
if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'symbol') {
target[prop] = value;
}
target[prop.toLowerCase()] = value;
return true;
}
};
var getPaddedComp = function getPaddedComp(comp) {
return parseInt(comp) < 10 ? '0' + comp : comp;
},
o = (_o = {
"[y|Y]{4}": function yY4(date) {
return date.getFullYear();
}, // year
"[y|Y]{2}": function yY2(date) {
return date.getFullYear().toString().slice(2);
}, // year
"MM": function MM(date) {
return getPaddedComp(date.getMonth() + 1);
}, //month
"M": function M(date) {
return date.getMonth() + 1;
}, //month
"[d|D]{2}": function dD2(date) {
return getPaddedComp(date.getDate());
}, //day
"[d|D]{1}": function dD1(date) {
return date.getDate();
}, //day
"h{2}": function h2(date) {
return getPaddedComp(date.getHours() > 12 ? date.getHours() % 12 : date.getHours());
}, //hour
"h{1}": function h1(date) {
return date.getHours() > 12 ? date.getHours() % 12 : date.getHours();
}, //hour
"H{2}": function H2(date) {
return getPaddedComp(date.getHours());
} }, _defineProperty(_o, 'h{1}', function h1(date) {
return date.getHours();
}), _defineProperty(_o, "m{2}", function m2(date) {
return getPaddedComp(date.getMinutes());
}), _defineProperty(_o, "m{1}", function m1(date) {
return date.getMinutes();
}), _defineProperty(_o, "s+", function s(date) {
return getPaddedComp(date.getSeconds());
}), _defineProperty(_o, "f+", function f(date) {
return getPaddedComp(date.getMilliseconds());
}), _defineProperty(_o, "b+", function b(date) {
return date.getHours() >= 12 ? 'PM' : 'AM';
}), _o);
$.extend(Date.prototype, {
toString: function toString(format) {
var formattedDate = format;
for (var k in o) {
if (new RegExp("(" + k + ")").test(format)) {
formattedDate = formattedDate.replace(RegExp.$1, o[k](this));
}
}
return formattedDate;
}
});
//删除数组中的空元素
$.extend(Array.prototype, {
clean: function clean() {
var deleteValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
for (var i = 0; i < this.length; i++) {
if (this[i] == deleteValue) {
this.splice(i, 1);
i--;
}
}
return this;
}
});
$.extend(Number.prototype, {
toString: function toString() {
return this.toFixed(2);
}
});
$.extend(String.prototype, {
toFloat: function toFloat() {
return parseFloat(this);
},
toInt: function toInt() {
return parseInt(this);
},
startsWith: function startsWith(str) {
return this.slice(0, str.length) == str;
},
endsWith: function endsWith(str) {
return this.slice(-str.length) == str;
},
includes: function includes(str) {
return this.indexOf(str) > -1;
},
replaceAll: function replaceAll(search, replacement) {
var target = this;
return target.replace(new RegExp(search, 'g'), replacement);
}
});
$.extend(window, {
parameters: function parameters(url) {
// get query string from url (optional) or window
var queryString = url ? url.split('?')[1] : window.location.search.slice(1);
var key = 'urlparameters' + queryString;
var obj = $(window).data(key);
if (obj == undefined) obj = new Proxy({}, PropertiesCaseInsensitive);else return obj;
// we'll store the parameters here
// if query string exists
if (queryString) {
// stuff after # is not part of query string, so get rid of it
queryString = queryString.split('#')[0];
// split our query string into its component parts
var arr = queryString.split('&');
for (var i = 0; i < arr.length; i++) {
// separate the keys and the values
var a = arr[i].split('=');
// set parameter name and value (use 'true' if empty)
var paramName = a[0];
var paramValue = typeof a[1] === 'undefined' ? true : a[1];
// if the paramName ends with square brackets, e.g. colors[] or colors[2]
if (paramName.match(/\[(\d+)?\]$/)) {
// create key if it doesn't exist
var key = paramName.replace(/\[(\d+)?\]/, '');
if (!obj[key]) obj[key] = [];
// if it's an indexed array e.g. colors[2]
if (paramName.match(/\[\d+\]$/)) {
// get the index value and add the entry at the appropriate position
var index = /\[(\d+)\]/.exec(paramName)[1];
obj[key][index] = paramValue;
} else {
// otherwise add the value to the end of the array
obj[key].push(paramValue);
}
} else {
// we're dealing with a string
if (!obj[paramName]) {
// if it doesn't exist, create property
obj[paramName] = paramValue;
} else if (obj[paramName] && typeof obj[paramName] === 'string') {
// if property does exist and it's a string, convert it to an array
obj[paramName] = [obj[paramName]];
obj[paramName].push(paramValue);
} else {
// otherwise add the property
obj[paramName].push(paramValue);
}
}
}
}
return obj;
}
});
})();
var config = GM_config([{
key: 'pagecount',
label: '最大页数 (自动获取时)',
default: 20,
type: 'dropdown',
values: [0, 5, 10, 20, 50, 1000]
}, {
key: 'batchtimezoneMinutes',
label: '预定时间(分钟)',
default: 60,
type: 'dropdown',
values: [5, 10, 20, 30, 50, 60, 90, 120, 300, 600, 1440, 10080]
}, {
key: 'version',
type: 'hidden',
default: 1
}]);
var conf = config.load();
config.onsave = function (cfg) {
conf = cfg;
$('#autogetnextpage').text('自动获取' + getAutoNextPagesCount() + "页");
};
GM_registerMenuCommand('设置', config.setup);
//*://www.51talk.com/ReserveNew/index*
//https://www.51talk.com/TeacherNew/info/t26501111
//https://www.51talk.com/TeacherNew/teacherComment?tid=t26501111&type=all&has_msg=1
//https://www.51talk.com/TeacherNew/teacherComment?tid=t26501111&type=good&has_msg=1
//https://www.51talk.com/TeacherNew/teacherComment?tid=t26501111&type=bad&has_msg=1
//https://www.51talk.com/user/study_center_zx
//https://www.51talk.com/user/study_center_zy
//https://www.51talk.com/user/study_center_xx
var url = window.location.href.toLocaleLowerCase();
var settings = {
'url': url,
'tid': url.match(/(t\d+)/g),
'pagecount': conf.pagecount,
'isDetailPage': url.includes("teachernew"),
'isListPage': url.includes('reservenew'),
'isCoursePage': url.includes('study_center')
};
function gettid() {
return settings.tid;
}
/**
* 提交运算函数到 document 的 fx 队列
*/
var submit = function submit(fun) {
var queue = $.queue(document, "fx", fun);
if (queue[0] == 'inprogress') {
return;
}
$.dequeue(document);
};
function getorAdd(key, func) {
if (!(key in sessionStorage)) {
var data = typeof func == 'function' ? func(key) : func;
sessionStorage.setItem(key, data);
return data;
}
return sessionStorage.getItem(key);
}
Pace.Options = {
ajax: false, // disabled
document: false, // disabled
eventLag: false, // disabled
elements: {
selectors: ['#filterdialog']
}
};
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() - start < delay) {
continue;
}
}
var asc = function asc(a, b) {
var av = $(a).attr('indicator');
var bv = $(b).attr('indicator');
if (!av || !bv) return 0;
return $(a).attr('indicator').toFloat() > $(b).attr('indicator').toFloat() ? 1 : -1;
};
var desc = function desc(a, b) {
var av = $(a).attr('indicator');
var bv = $(b).attr('indicator');
if (!av || !bv) return 0;
return $(a).attr('indicator').toFloat() > $(b).attr('indicator').toFloat() ? -1 : 1;
};
var sortByIndicator = function sortByIndicator(sortBy) {
var sortEle = $('.s-t-content.f-cb .item').sort(sortBy);
$('.s-t-content.f-cb').empty().append(sortEle);
};
function getBatchNumber() {
var batchnumber = $("input[name='Date']").val() + $("input[name='selectTime']").val();
return getorAdd(batchnumber, function (key) {
return new Date().getTime();
});
}
function getLeftPageCount() {
var pages = Number($('.s-t-page>.next-page:first').prev().text());
var curr = Number($('.s-t-page>.active:first').text());
if (pages) return pages - curr;else return 0;
}
function getAutoNextPagesCount() {
var pages = getLeftPageCount();
if (settings.pagecount > pages) return pages;else return settings.pagecount;
}
$("head").append('\n\t\t');
$("head").append('');
var maxrate = 0,
minrate = 99999,
maxlabel = 0,
minlabel = 9999999,
maxfc = 0,
minfc = 999999,
maxage = 0,
minage = 99999;
var configExprMilliseconds = 3600000 * GM_getValue('tinfoexprhours', 168); //缓存7天小时
var num = /[0-9]*/g;
function updateTeacherinfoToUI(jqel, tinfo) {
if (tinfo.label > maxlabel) maxlabel = tinfo.label;
if (tinfo.label < minlabel) minlabel = tinfo.label;
if (tinfo.favoritesCount > maxfc) maxfc = tinfo.favoritesCount;
if (tinfo.favoritesCount < minfc) minfc = tinfo.favoritesCount;
if (tinfo.thumbupRate > maxrate) maxrate = tinfo.thumbupRate;
if (tinfo.thumbupRate < minrate) minrate = tinfo.thumbupRate;
if (tinfo.age > maxage) maxage = tinfo.age;
if (tinfo.age < minage) minage = tinfo.age;
jqel.attr("teacherinfo", JSON.stringify(tinfo));
jqel.find(".teacher-name").html(jqel.find(".teacher-name").text() + "
[" + tinfo.label + "|" + tinfo.thumbupRate + "%|" + tinfo.favoritesCount + "]");
jqel.find(".teacher-age").html(jqel.find(".teacher-age").text() + " | ");
jqel.attr('indicator', tinfo.indicator);
}
function executeFilters(uifilters) {
var tcount = 0,
hidecount = 0;
$.each($('.item'), function (i, item) {
var node = $(item);
var tinfojson = node.attr("teacherinfo");
if (!tinfojson) {
return true;
}
var tinfo = JSON.parse(tinfojson);
if (tinfo.thumbupRate >= uifilters.rate1 && tinfo.thumbupRate <= uifilters.rate2 && tinfo.label >= uifilters.l1 && tinfo.label <= uifilters.l2 && tinfo.age >= uifilters.age1 && tinfo.age <= uifilters.age2 && tinfo.favoritesCount >= uifilters.fc1 && tinfo.favoritesCount <= uifilters.fc2) {
if (node.is(':hidden')) {
//如果node是隐藏的则显示node元素,否则隐藏
node.show();
node.animate({
left: "+=50"
}, 3500).animate({
left: "-=50"
}, 3500);
} else {
//nothing todo
}
tcount++;
} else {
node.css('color', 'white').hide();
hidecount++;
}
});
$('#tcount').text(tcount);
$('#thidecount').text(hidecount);
}
function getUiFilters() {
var l1 = $("#tlabelslider").slider('values', 0);
var l2 = $("#tlabelslider").slider('values', 1);
var rate1 = $("#thumbupRateslider").slider('values', 0);
var rate2 = $("#thumbupRateslider").slider('values', 1);
var age1 = $("#tAgeSlider").slider('values', 0);
var age2 = $("#tAgeSlider").slider('values', 1);
var fc1 = $("#fcSlider").slider('values', 0);
var fc2 = $("#fcSlider").slider('values', 1);
return {
l1: l1,
l2: l2,
rate1: rate1,
rate2: rate2,
age1: age1,
age2: age2,
fc1: fc1,
fc2: fc2
};
}
function getinfokey() {
return 'tinfo-' + gettid();
};
if (settings.isListPage) {
var getTeacherInfoInList = function getTeacherInfoInList(jqel) {
var age = Number(jqel.find(".teacher-age").text().match(num).clean("")[0]);
var label = function () {
var j_len = jqel.find(".label").text().match(num).clean("").length;
var l = 0;
for (var j = 0; j < j_len; j++) {
l += Number(jqel.find(".label").text().match(num).clean("")[j]);
}
l = Math.ceil(l / 5);
return l;
}();
var name = jqel.find(".teacher-name").text();
var type = $('.s-t-top-list .li-active').text();
var effectivetime = getBatchNumber();
if (type == '收藏外教') {
var isfavorite = true;
return {
age: age,
label: label,
name: name,
effectivetime: effectivetime,
isfavorite: isfavorite
};
} else return {
age: age,
label: label,
name: name,
effectivetime: effectivetime,
type: type
};
};
//获取列表中数据
$(".item-top-cont").prop('innerHTML', function (i, val) {
return val.replaceAll('', '');
});
$(".s-t-days-list>li").click(function () {
var batchnumber = $("input[name='Date']").val() + $("input[name='selectTime']").val();
sessionStorage.setItem(batchnumber, new Date().getTime());
});
$(".condition-type-time>li").click(function () {
var batchnumber = $("input[name='Date']").val() + $("input[name='selectTime']").val();
sessionStorage.setItem(batchnumber, new Date().getTime());
});
$(".s-t-top-list>li>a").click(function () {
var batchnumber = $("input[name='Date']").val() + $("input[name='selectTime']").val();
sessionStorage.setItem(batchnumber, new Date().getTime());
});
// 自动获取时,显示停止按钮
submit(function (next) {
var autonextpagecount = GM_getValue('autonextpagecount', 1);
var curPageId = $('form[name="searchform"]>input[name="pageID"]').val();
if (autonextpagecount > 0 && $('.s-t-page>.next-page').length > 0) {
var dialog = $('
\n\t\t\t\u70B9\u51FB\u7ACB\u5373\u505C\u6B62\uFF0C \u5C06\u505C\u6B62\u83B7\u53D6\u540E\u7EED\u6559\u5E08
\n \u5F53\u524D\u7B2C' + (window.parameters().pageID ? window.parameters().pageID : 1) + '\u9875\uFF0C\u603B\u8BA1' + $('.s-t-page>a:eq(-2)').text() + '\u9875
\n\t\t\t