Telegram Web, preconfigured for usage in I2P.
http://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
7.3 KiB
272 lines
7.3 KiB
/*! |
|
* Webogram v0.5.5 - messaging web application for MTProto |
|
* https://github.com/zhukov/webogram |
|
* Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com> |
|
* https://github.com/zhukov/webogram/blob/master/LICENSE |
|
*/ |
|
|
|
'use strict' |
|
|
|
/* Filters */ |
|
|
|
angular.module('myApp.filters', ['myApp.i18n']) |
|
|
|
.filter('userName', function (_) { |
|
return function (user) { |
|
if (!user || !user.first_name && !user.last_name) { |
|
return _('user_name_deleted') |
|
} |
|
return user.first_name + (user.last_name ? ' ' + user.last_name : '') |
|
} |
|
}) |
|
|
|
.filter('userFirstName', function (_) { |
|
return function (user) { |
|
if (!user || !user.first_name && !user.last_name) { |
|
return _('user_first_name_deleted') |
|
} |
|
return user.first_name || user.last_name |
|
} |
|
}) |
|
|
|
.filter('userStatus', function ($filter, _) { |
|
var relativeTimeFilter = $filter('relativeTime') |
|
return function (user, botChatPrivacy) { |
|
if (!(user.id % 1000)) { |
|
if (user.id == 777000) { |
|
return _('user_status_service_notifications') |
|
} |
|
return _('user_status_support') |
|
} |
|
var statusType = user && user.status && user.status._ |
|
if (!statusType) { |
|
statusType = user && user.pFlags && user.pFlags.bot ? 'userStatusBot' : 'userStatusEmpty' |
|
} |
|
switch (statusType) { |
|
case 'userStatusOnline': |
|
return _('user_status_online') |
|
|
|
case 'userStatusOffline': |
|
return _('user_status_last_seen', relativeTimeFilter(user.status.was_online)) |
|
|
|
case 'userStatusRecently': |
|
return _('user_status_recently') |
|
|
|
case 'userStatusLastWeek': |
|
return _('user_status_last_week') |
|
|
|
case 'userStatusLastMonth': |
|
return _('user_status_last_month') |
|
|
|
case 'userStatusBot': |
|
if (botChatPrivacy) { |
|
if (user.pFlags.bot_chat_history) { |
|
return _('user_status_bot_noprivacy') |
|
} else { |
|
return _('user_status_bot_privacy') |
|
} |
|
} |
|
return _('user_status_bot') |
|
|
|
case 'userStatusEmpty': |
|
default: |
|
return _('user_status_long_ago') |
|
} |
|
} |
|
}) |
|
|
|
.filter('chatTitle', function (_) { |
|
return function (chat) { |
|
if (!chat || !chat.title) { |
|
return _('chat_title_deleted') |
|
} |
|
return chat.title |
|
} |
|
}) |
|
|
|
.filter('dateOrTime', function ($filter) { |
|
var dateFilter = $filter('date') |
|
|
|
return function (timestamp, extended) { |
|
if (!timestamp) { |
|
return '' |
|
} |
|
var ticks = timestamp * 1000 |
|
var diff = Math.abs(tsNow() - ticks) |
|
var format = 'shortTime' |
|
|
|
if (diff > 518400000) { // 6 days |
|
format = extended ? 'mediumDate' : 'shortDate' |
|
} |
|
else if (diff > 43200000) { // 12 hours |
|
format = extended ? 'EEEE' : 'EEE' |
|
} |
|
|
|
return dateFilter(ticks, format) |
|
} |
|
}) |
|
|
|
.filter('time', function ($filter) { |
|
var cachedDates = {} |
|
var dateFilter = $filter('date') |
|
var format = Config.Mobile ? 'shortTime' : 'mediumTime' |
|
|
|
return function (timestamp) { |
|
if (cachedDates[timestamp]) { |
|
return cachedDates[timestamp] |
|
} |
|
|
|
return cachedDates[timestamp] = dateFilter(timestamp * 1000, format) |
|
} |
|
}) |
|
|
|
.filter('myDate', function ($filter) { |
|
var cachedDates = {} |
|
var dateFilter = $filter('date') |
|
|
|
return function (timestamp) { |
|
if (cachedDates[timestamp]) { |
|
return cachedDates[timestamp] |
|
} |
|
|
|
return cachedDates[timestamp] = dateFilter(timestamp * 1000, 'fullDate') |
|
} |
|
}) |
|
|
|
.filter('duration', [function () { |
|
return function (duration) { |
|
duration = parseInt(duration) |
|
if (isNaN(duration)) { |
|
duration = 0 |
|
} |
|
var hours = Math.floor(duration / 3600) |
|
var mins = Math.floor((duration % 3600) / 60) |
|
var secs = duration % 60 |
|
|
|
var durationStr = (hours ? hours + ':' : '') + mins + ':' + secs |
|
|
|
durationStr = durationStr.replace(/:(\d(?::|$))/g, ':0$1') |
|
|
|
return durationStr |
|
} |
|
}]) |
|
|
|
.filter('durationRemains', function ($filter) { |
|
var durationFilter = $filter('duration') |
|
|
|
return function (done, total) { |
|
return '-' + durationFilter(total - done) |
|
} |
|
}) |
|
|
|
.filter('phoneNumber', [function () { |
|
return function (phoneRaw) { |
|
var nbsp = ' ' |
|
phoneRaw = (phoneRaw || '').replace(/\D/g, '') |
|
if (phoneRaw.charAt(0) == '7' && phoneRaw.length == 11) { |
|
return '+' + phoneRaw.charAt(0) + nbsp + '(' + phoneRaw.substr(1, 3) + ')' + nbsp + phoneRaw.substr(4, 3) + '-' + phoneRaw.substr(7, 2) + '-' + phoneRaw.substr(9, 2) |
|
} |
|
return '+' + phoneRaw |
|
} |
|
}]) |
|
|
|
.filter('formatSize', [function () { |
|
return function (size, progressing) { |
|
if (!size) { |
|
return '0' |
|
} |
|
else if (size < 1024) { |
|
return size + ' b' |
|
} |
|
else if (size < 1048576) { |
|
return Math.round(size / 1024) + ' KB' |
|
} |
|
var mbs = size / 1048576 |
|
if (progressing) { |
|
mbs = mbs.toFixed(1) |
|
} else { |
|
mbs = (Math.round(mbs * 10) / 10) |
|
} |
|
return mbs + ' MB' |
|
} |
|
}]) |
|
|
|
.filter('formatSizeProgress', function ($filter, _) { |
|
var formatSizeFilter = $filter('formatSize') |
|
return function (progress) { |
|
if (!progress.total) { |
|
return '' |
|
} |
|
var done = formatSizeFilter(progress.done, true) |
|
var doneParts = done.split(' ') |
|
var total = formatSizeFilter(progress.total) |
|
var totalParts = total.split(' ') |
|
|
|
if (totalParts[1] === doneParts[1]) { |
|
return _('format_size_progress_mulitple', {done: doneParts[0], total: totalParts[0], parts: (doneParts[1] || '')}) |
|
} |
|
return _('format_size_progress', {done: done, total: total}) |
|
} |
|
}) |
|
|
|
.filter('formatShortNumber', [function () { |
|
return function (num) { |
|
if (!num) { |
|
return '0' |
|
} |
|
else if (num < 1000) { |
|
return num.toString() |
|
} |
|
else if (num < 900000) { |
|
var mult = num > 10000 ? 1 : 10 |
|
return (Math.round(num / 1000 * mult) / mult) + 'K' |
|
} |
|
var mult = num > 10000000 ? 1 : 10 |
|
return (Math.round(num / 1000000 * mult) / mult) + 'M' |
|
} |
|
}]) |
|
|
|
.filter('nl2br', [function () { |
|
return function (text) { |
|
return text.replace(/\n/g, '<br/>') |
|
} |
|
}]) |
|
|
|
.filter('shortUrl', [function () { |
|
return function (text) { |
|
if (typeof text !== 'string') { |
|
return text |
|
} |
|
return text.replace(/^https?:\/\//, '').replace(/^www\./, '') |
|
} |
|
}]) |
|
|
|
.filter('richText', function ($filter) { |
|
var linkyFilter = $filter('linky') |
|
return function (text) { |
|
return linkyFilter(text, '_blank').replace(/\n| /g, '<br/>') |
|
} |
|
}) |
|
|
|
.filter('relativeTime', function ($filter, _) { |
|
var langMinutesPluralize = _.pluralize('relative_time_pluralize_minutes_ago') |
|
var langHoursPluralize = _.pluralize('relative_time_pluralize_hours_ago') |
|
var dateOrTimeFilter = $filter('dateOrTime') |
|
|
|
return function (timestamp) { |
|
var diff = Math.abs(tsNow(true) - timestamp) |
|
|
|
if (diff < 60) { |
|
return _('relative_time_just_now') |
|
} |
|
if (diff < 3600) { |
|
var minutes = Math.floor(diff / 60) |
|
return langMinutesPluralize(minutes) |
|
} |
|
if (diff < 86400) { |
|
var hours = Math.floor(diff / 3600) |
|
return langHoursPluralize(hours) |
|
} |
|
return dateOrTimeFilter(timestamp, true) |
|
} |
|
})
|
|
|