Przeglądaj źródła

Add email users

causefx 8 lat temu
rodzic
commit
36bef29832

+ 1 - 0
.gitignore

@@ -97,3 +97,4 @@ css/themes/*.css
 *sonflix*
 plugins/images/cache/*.jpg
 testdata*
+strings.txt

+ 13 - 2
api/functions/normal-functions.php

@@ -330,7 +330,13 @@ function getServerPath($over=false) {
         	$domain = $_SERVER['HTTP_HOST'];
 		}
 	}
-    return $protocol . $domain . str_replace("\\", "/", dirname($_SERVER['REQUEST_URI']));
+	$url = $protocol . $domain . str_replace("\\", "/", dirname($_SERVER['REQUEST_URI']));
+	if (strpos($url, '/api') !== false) {
+		$url = explode('/api', $url);
+		return $url[0].'/';
+	}else{
+		return $url;
+	}
 }
 function get_browser_name() {
     $user_agent = $_SERVER['HTTP_USER_AGENT'];
@@ -342,6 +348,11 @@ function get_browser_name() {
     elseif (strpos($user_agent, 'MSIE') || strpos($user_agent, 'Trident/7')) return 'Internet Explorer';
     return 'Other';
 }
-function getServer(){
+function getServer($over=false){
+	if($over){
+		if($GLOBALS['PHPMAILER-domain'] !== ''){
+			return $GLOBALS['PHPMAILER-domain'];
+		}
+	}
     return isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : $_SERVER["SERVER_NAME"];
 }

+ 9 - 68
api/functions/organizr-functions.php

@@ -852,6 +852,15 @@ function sabnzbdAction($action=null, $target=null) {
         return $api;
     }
 }
+function getOrgUsers(){
+	$result = allUsers();
+		if (is_array($result) || is_object($result)){
+			foreach($result['users'] as $k => $v){
+				$return[$v['username']] = $v['email'];
+			}
+			return $return;
+		}
+}
 function convertPlexName($user, $type){
 	$array = libraryList('plex');
 	switch ($type){
@@ -951,71 +960,3 @@ function plexJoin($username, $email, $password){
     };
     return false;
 }
-/*
-function sendEmail($email = null, $username = "Organizr User", $subject, $body, $cc = null, $bcc = null){
-	try {
-		$mail = new PHPMailer(true);
-		$mail->isSMTP();
-		$mail->Host = $GLOBALS['smtpHost'];
-		$mail->SMTPAuth = $GLOBALS['smtpHostAuth'];
-		$mail->Username = $GLOBALS['smtpHostUsername'];
-		$mail->Password = $GLOBALS['smtpHostPassword'];
-		$mail->SMTPSecure = $GLOBALS['smtpHostType'];
-		$mail->Port = $GLOBALS['smtpHostPort'];
-		$mail->setFrom($GLOBALS['smtpHostSenderEmail'], $GLOBALS['smtpHostSenderName']);
-		$mail->addReplyTo($GLOBALS['smtpHostSenderEmail'], $GLOBALS['smtpHostSenderName']);
-		$mail->isHTML(true);
-		if($email){
-			$mail->addAddress($email, $username);
-		}
-		if($cc){
-			$mail->addCC($cc);
-		}
-		if($bcc){
-			if(strpos($bcc , ',') === false){
-				$mail->addBCC($bcc);
-			}else{
-				$allEmails = explode(",",$bcc);
-				foreach($allEmails as $gotEmail){
-					$mail->addBCC($gotEmail);
-				}
-			}
-		}
-		$mail->Subject = $subject;
-		$mail->Body    = $body;
-		$mail->send();
-		writeLog('success', 'Mail Function -  E-Mail Sent', $GLOBALS['organizrUser']['username']);
-		return true;
-	} catch (Exception $e) {
-		writeLog('error', 'Mail Function -  E-Mail Failed['.$mail->ErrorInfo.']', $GLOBALS['organizrUser']['username']);
-		return false;
-	}
-	return false;
-}
-//EMAIL SHIT
-function sendTestEmail($to, $from, $host, $auth, $username, $password, $type, $port, $sendername){
-	try {
-		$mail = new PHPMailer(true);
-		$mail->isSMTP();
-		$mail->Host = $host;
-		$mail->SMTPAuth = $auth;
-		$mail->Username = $username;
-		$mail->Password = $password;
-		$mail->SMTPSecure = $type;
-		$mail->Port = $port;
-		$mail->setFrom($from, $sendername);
-		$mail->addReplyTo($from, $sendername);
-		$mail->isHTML(true);
-		$mail->addAddress($to, "Organizr Admin");
-		$mail->Subject = "Organizr Test E-Mail";
-		$mail->Body    = "This was just a test!";
-		$mail->send();
-		writeLog('success', 'Mail Function -  E-Mail Test Sent', $GLOBALS['organizrUser']['username']);
-		return true;
-	} catch (Exception $e) {
-		writeLog('error', 'Mail Function -  E-Mail Test Failed['.$mail->ErrorInfo.']', $GLOBALS['organizrUser']['username']);
-		return false;
-	}
-	return false;
-}
-*/

+ 22 - 0
api/plugins/api/php-mailer.php

@@ -23,6 +23,28 @@ if(isset($_POST['data']['plugin'])){
                 $result['data'] = null;
             }
             break;
+        case 'PHPMailer/send/email':
+            if(qualifyRequest(1)){
+                $result['status'] = 'success';
+                $result['statusText'] = 'success';
+                $result['data'] = phpmAdminSendEmail();
+            }else{
+                $result['status'] = 'error';
+                $result['statusText'] = 'API/Token invalid or not set';
+                $result['data'] = null;
+            }
+            break;
+		case 'PHPMailer/users/get':
+            if(qualifyRequest(1)){
+                $result['status'] = 'success';
+                $result['statusText'] = 'success';
+                $result['data'] = getEmails();
+            }else{
+                $result['status'] = 'error';
+                $result['statusText'] = 'API/Token invalid or not set';
+                $result['data'] = null;
+            }
+	            break;
         default:
             //DO NOTHING!!
             break;

+ 2 - 2
api/plugins/js/invites.js

@@ -203,7 +203,7 @@ $(window).on('load', function() {
 	`;
     if(activeInfo.plugins["INVITES-enabled"] == true){
         if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
-            menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-sign-out fa-fw"></i> <span lang="en">Manage Invites</span></a></li>`;
+            menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-ticket fa-fw"></i> <span lang="en">Manage Invites</span></a></li>`;
             htmlDOM += `
         	<div id="new-invite-area" class="white-popup mfp-with-anim mfp-hide">
         		<div class="col-md-10 col-md-offset-1">
@@ -238,7 +238,7 @@ $(window).on('load', function() {
         		</div>
         	</div>`;
         }else if (activeInfo.user.loggedin === false){
-            menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-sign-out fa-fw"></i> <span lang="en">Use Invite Code</span></a></li>`;
+            menuList = `<li><a class="inline-popups inviteModal" href="#invite-area" data-effect="mfp-zoom-out"><i class="fa fa-ticket fa-fw"></i> <span lang="en">Use Invite Code</span></a></li>`;
         }
         $('.append-menu').after(menuList);
         $('.organizr-area').after(htmlDOM);

+ 161 - 1
api/plugins/js/php-mailer.js

@@ -19,12 +19,172 @@ $(document).on('click', '#PHPMAILER-settings-button', function() {
 */
 
 // FUNCTIONS
+function sendMail(){
+    var to = $('#sendEmailToInput').val();
+    var subject = $('#sendEmailSubjectInput').val();
+    var body = tinyMCE.get('sendEmail').getContent();
+    if(to == ''){
+        messageSingle('','Please Enter Email','bottom-right','#FFF','error','5000');
+    }else if(subject == ''){
+        messageSingle('','Please Enter Subject','bottom-right','#FFF','error','5000');
+    }else if(body == ''){
+        messageSingle('','Please Enter Body','bottom-right','#FFF','error','5000');
+    }
+    if(to !== '' && subject !== '' && body !== ''){
+        var post = {
+            plugin:'PHPMailer/send/email', // used for switch case in your API call
+            bcc:to,
+            subject:subject,
+            body:body
+        };
+        ajaxloader(".content-wrap","in");
+        organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
+            var response = JSON.parse(data);
+            if(response.data == true){
+                messageSingle('',window.lang.translate('Email Sent Successful'),'bottom-right','#FFF','success','5000');
+            }else{
+                messageSingle('',response.data,'bottom-right','#FFF','error','5000');
+            }
+        }).fail(function(xhr) {
+            console.error("Organizr Function: API Connection Failed");
+        });
+        ajaxloader();
+    }
+}
+function buildUserList(array){
+    var users = '';
+    var htmlDOM = '';
+	$.each(array, function(i,v) {
+        users += '<option value="'+v+'">'+i+'</option>';
+    });
+    htmlDOM = `
+    <select multiple id="email-user-list" name="email-user-list[]">`+users+`</select>
+    <div class="button-box m-t-20">
+        <a id="select-all-users-list" class="btn btn-danger btn-outline" href="#">select all</a>
+        <a id="deselect-all-users-list" class="btn btn-info btn-outline" href="#">deselect all</a>
+        <a id="minimize-users-list" class="btn btn-primary btn-outline" href="#">minimize</a>
+    </div>`;
+    return htmlDOM;
+}
+function buildEmailModal(){
+    var htmlDOM = `
+    <div class="row">
+        <div class="col-md-12">
+            <div class="panel panel-info m-0">
+                <div class="panel-heading">
+                    <span lang="en">Email Users</span>
+                    <div class="btn-group pull-right">
+
+						<button class="btn btn-info waves-effect waves-light loadUserList" type="button">
+							<i class="fa fa-user m-r-5"></i>
+						</button>
+                        <button class="btn btn-info waves-effect waves-light unhide-user-list hidden" type="button">
+							<i class="fa fa-eye m-r-5"></i>
+						</button>
+						<button class="btn btn-info waves-effect waves-light" onclick="sendMail();"><i class="fa fa-paper-plane m-l-5"></i></button>
+
+	                </div>
+                </div>
+                <div class="panel-wrapper collapse in main-email-panel" aria-expanded="true">
+                    <div class="panel-body">
+                        <div class="form-body">
+                            <div class="row">
+                                <div class="col-md-6">
+                                    <div class="form-group">
+                                        <label class="control-label" lang="en">To:</label>
+                                        <input type="text" id="sendEmailToInput" class="form-control"></div>
+                                </div>
+                                <div class="col-md-6">
+                                    <div class="form-group">
+                                        <label class="control-label" lang="en">Subject</label>
+                                        <input type="text" id="sendEmailSubjectInput" class="form-control"></div>
+                                </div>
+                                <div class="col-md-12" id="user-list-div">
+
 
+                                </div>
+                            </div>
+                            <!--/row-->
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <textarea id="sendEmail" name="area"></textarea>
+    `;
+    $('.email-div').html(htmlDOM);
+    if ($("#sendEmail").length > 0) {
+        tinymce.init({
+            selector: "textarea#sendEmail",
+            theme: "modern",
+            height: 300,
+            plugins: [
+                "advlist autolink link image lists charmap print preview hr anchor pagebreak spellchecker", "searchreplace wordcount visualblocks visualchars code fullscreen insertdatetime media nonbreaking", "save table contextmenu directionality emoticons template paste textcolor"
+            ],
+            toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | l      ink image | print preview media fullpage | forecolor backcolor emoticons",
+        });
+    }
+
+}
 // EVENTS and LISTENERS
+$(document).on("change", "#email-user-list", function () {
+    $('#sendEmailToInput').val($('#email-user-list').val());
+});
+$(document).on('click', '.loadUserList', function() {
+    var post = {
+        plugin:'PHPMailer/users/get', // used for switch case in your API call
+    };
+    ajaxloader(".content-wrap","in");
+    organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
+        var response = JSON.parse(data);
+        console.log(response);
+        $('#user-list-div').html(buildUserList(response.data));
+        $('#email-user-list').multiSelect();
+    }).fail(function(xhr) {
+        console.error("Organizr Function: API Connection Failed");
+    });
+    ajaxloader();
+});
+$(window).on('load', function() {
+    if(activeInfo.plugins["PHPMAILER-enabled"] == true){
+        if (activeInfo.user.loggedin === true && activeInfo.user.groupID <= 1) {
+            var menuList = `<li><a class="inline-popups emailModal" href="#email-area" data-effect="mfp-zoom-out"><i class="fa fa-envelope fa-fw"></i> <span lang="en">E-Mail Center</span></a></li>`;
+            var htmlDOM = `
+        	<div id="email-area" class="white-popup mfp-with-anim mfp-hide">
+        		<div class="col-md-10 col-md-offset-1">
+        			<div class="email-div"></div>
+        		</div>
+        	</div>
+        	`;
+            $('.organizr-area').after(htmlDOM);
+            $('.append-menu').after(menuList);
+            pageLoad();
+        }
+    }
+
+
+});
+$(document).on("click", ".emailModal", function(e) {
+    buildEmailModal();
+});
 $(document).on("click", ".show-login", function(e) {
-    console.log('click');
     setTimeout(addForgotPassword, 1000);
 });
+$(document).on("click", "#select-all-users-list", function(e) {
+    $('#email-user-list').multiSelect('select_all');
+    return false;
+});
+$(document).on("click", "#deselect-all-users-list", function(e) {
+    $('#email-user-list').multiSelect('deselect_all');
+    return false;
+});
+$(document).on("click", "#minimize-users-list, .unhide-user-list", function(e) {
+    $('.main-email-panel').toggleClass('hidden');
+    $('.loadUserList').toggleClass('hidden');
+    $('.unhide-user-list').toggleClass('hidden');
+    return false;
+});
 function addForgotPassword(){
     var item = '';
     if(activeInfo.plugins["PHPMAILER-enabled"] == true){

+ 37 - 0
api/plugins/php-mailer.php

@@ -19,6 +19,23 @@ $GLOBALS['plugins'][]['PHP Mailer'] = array( // Plugin Name
 // INCLUDE/REQUIRE FILES
 
 // PLUGIN FUNCTIONS
+function getEmails(){
+	if($GLOBALS['authBackend']){
+		if($GLOBALS['authBackend'] == 'plex'){
+			$type = 'plex';
+		}
+	}else{
+		$type = 'none';
+	}
+	if($type == 'plex'){
+		$emails = array_merge(libraryList('plex')['both'],getOrgUsers());
+	}elseif($type == 'emby'){
+		$emails = getOrgUsers();
+	}else{
+		$emails = getOrgUsers();
+	}
+	return $emails;
+}
 function getTemplates(){
 	foreach (glob(dirname(__DIR__,2).DIRECTORY_SEPARATOR.'api' .DIRECTORY_SEPARATOR.'plugins' .DIRECTORY_SEPARATOR.'misc' . DIRECTORY_SEPARATOR . 'emailTemplates' . DIRECTORY_SEPARATOR . "*.php") as $filename){
 		$templates[] = array(
@@ -58,6 +75,26 @@ function phpmBuildEmail($email){
 	include('misc/emailTemplates/'.$GLOBALS['PHPMAILER-template'].'.php');
 	return $email;
 }
+function phpmAdminSendEmail(){
+	if($GLOBALS['PHPMAILER-enabled']){
+		$emailTemplate = array(
+			'type' => 'admin',
+			'body' => $_POST['data']['body'],
+			'subject' => $_POST['data']['subject'],
+			'user' => null,
+			'password' => null,
+			'inviteCode' => null,
+		);
+		$emailTemplate = phpmEmailTemplate($emailTemplate);
+		$sendEmail = array(
+			'bcc' => $_POST['data']['bcc'],
+			'subject' => $emailTemplate['subject'],
+			'body' => phpmBuildEmail($emailTemplate),
+		);
+		return phpmSendEmail($sendEmail);
+	}
+	return false;
+}
 function phpmSendTestEmail(){
 	try {
 		$mail = new PHPMailer\PHPMailer\PHPMailer(true);

+ 6 - 0
css/organizr.css

@@ -338,3 +338,9 @@ input#inviteCodeInput {
   font-size: 400%;
   height: 100%;
 }
+.bg-plex {
+	background: #E5A00D;
+}
+.bg-emby {
+  background: #4CAF50;
+}

+ 4 - 1
index.php

@@ -25,7 +25,8 @@
 	<link href="plugins/bower_components/calendar/dist/fullcalendar.css" rel="stylesheet" />
 	<link rel="stylesheet" href="https://cdn.plyr.io/3.1.0/plyr.css">
 	<link href="plugins/bower_components/custom-select/custom-select.css" rel="stylesheet" type="text/css" />
-<link href="plugins/bower_components/bootstrap-select/bootstrap-select.min.css" rel="stylesheet" />
+	<link href="plugins/bower_components/bootstrap-select/bootstrap-select.min.css" rel="stylesheet" />
+	<link href="plugins/bower_components/multiselect/css/multi-select.css" rel="stylesheet" type="text/css" />
 	<link id="style" href="css/dark.css?v=<?php echo $GLOBALS['installedVersion']; ?>" rel="stylesheet">
 	<link href="css/organizr.css?v=<?php echo $GLOBALS['installedVersion']; ?>" rel="stylesheet">
 	<?php echo pluginFiles('css'); ?>
@@ -144,6 +145,8 @@
 	<script src="plugins/bower_components/calendar/dist/fullcalendar.js"></script>
 	<script src="plugins/bower_components/custom-select/custom-select.min.js" type="text/javascript"></script>
     <script src="plugins/bower_components/bootstrap-select/bootstrap-select.min.js" type="text/javascript"></script>
+	<script src="plugins/bower_components/tinymce/tinymce.min.js"></script>
+	<script type="text/javascript" src="plugins/bower_components/multiselect/js/jquery.multi-select.js"></script>
 	<script src="https://cdn.plyr.io/3.1.0/plyr.js"></script>
 	<script src="https://apis.google.com/js/client.js?onload=googleApiClientReady"></script>
 	<script src="js/functions.js?v=<?php echo $GLOBALS['installedVersion']; ?>"></script>

+ 3 - 2
js/functions.js

@@ -2937,7 +2937,7 @@ function buildMetadata(array, source){
 	                <h2 class="m-b-0 font-medium pull-right text-right">
 						`+v.title+`<br>
 						<small class="m-t-0 text-white">`+v.metadata.tagline+`</small><br>
-						<a class="openTab" data-tab-name="`+v.tabName+`" data-type="`+v.type+`" data-open-tab="`+v.openTab+`" data-url="`+v.address+`" href="javascript:void(0);"><i class="mdi mdi-`+source+` mdi-36px text-`+source+`"></i></a><br>
+						<button class="btn waves-effect waves-light openTab bg-`+source+`" type="button" data-tab-name="`+v.tabName+`" data-type="`+v.type+`" data-open-tab="`+v.openTab+`" data-url="`+v.address+`" href="javascript:void(0);"> <i class="fa mdi mdi-`+source+` fa-2x"></i> </button>
 						`+buildYoutubeLink(v.title+' '+v.metadata.year+' '+v.type)+`
 					</h2>
 	            </div>
@@ -2965,12 +2965,13 @@ function buildYoutubeLink(title){
 	if(title){
 		var str = createRandomString(10);
 		return `
-		<a href="javascript:void(0);"><i class="mdi mdi-youtube-play mdi-36px text-danger" onclick="youtubeCheck('`+escape(title)+`','`+str+`')"></i></a>
+		<button class="btn btn-youtube waves-effect waves-light" type="button" onclick="youtubeCheck('`+escape(title)+`','`+str+`')"> <i class="fa fa-youtube-play fa-2x"></i> </button>
 		<a class="hidden inline-popups `+str+`" href="#open-youtube" data-effect="mfp-zoom-out"></a>
 		`;
 	}
 }
 function buildCalendarMetadata(array){
+	console.log(array)
 	var metadata = '';
 	var genres = '';
 	var actors = '';

+ 2 - 2
plugins/bower_components/multiselect/css/multi-select.css

@@ -1,6 +1,6 @@
 .ms-container{
   background: transparent url('../img/switch.png') no-repeat 50% 50%;
-  width: 370px;
+  width: 100%;
 }
 
 .ms-container:after{
@@ -90,4 +90,4 @@
   background-color: #eee;
   color: #aaa;
   cursor: text;
-}
+}